Вопрос по oop, php, static, php-5.3 – В чем разница между self :: $ bar и static :: $ bar в PHP? [Дубликат]

97

Possible Duplicate:
New self vs. new static

В чем разница между использованиемself а такжеstatic в приведенном ниже примере?

class Foo
{
    protected static $bar = 1234;

    public static function instance()
    {
        echo self::$bar;
        echo "\n";
        echo static::$bar;
    }

}

Foo::instance();
produces
1234
1234
@ deceze, как говорили другие, это не дубликат insign
@deceze: это аналогичный вопрос, но он не является дубликатом. Этот спрашивает об использовании ключевых слов со свойствами, в то время как об использовании их с конструкторами. BoltClock♦
@ Болт Та же самая механика, хотя, нет? deceze♦
@ deceze - я прочитал этот вопрос - я не думаю, что это дубликат cwd

Ваш Ответ

2   ответа
38
self - refers to the same class whose method the new operation takes place in.

static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.

get_called_class ()), класс B наследует оба метода от класса A. Self связан с A, потому что он определен в реализации метода A, в то время как static связан с вызываемым классом, несмотря на то, что он также находится в A. реализация метода.

class A {
    public static function get_A() {
        return new self();
    }

    public static function get_me() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_A());  // A
echo get_class(B::get_me()); // B
echo get_class(A::get_me()); // A
... но у меня нетnew в моем примере? cwd
@cwd Но поведение со свойствами, константами, методами такое же ...
158

self чтобы ссылаться на члена класса, вы ссылаетесь на класс, в котором вы используете ключевое слово. В этом случае вашFoo класс определяет защищенное статическое свойство, называемое$bar, self вFoo класс для ссылки на свойство, вы ссылаетесь на тот же класс.

Поэтому, если вы пытались использоватьself::$bar в другом месте в вашемFoo класс, но у вас былBar класс с другим значением для свойства, он будет использоватьFoo::$bar вместоBar::$bar, что может быть не тем, что вы намереваетесь

class Foo
{
    protected static $bar = 1234;
}

class Bar extends Foo
{
    protected static $bar = 4321;
}

staticвы вызываете функцию под названиемпоздние статические привязки (введено в PHP 5.3).

В приведенном выше сценарии, используяstatic вместоself приведет кBar::$bar используется вместоFoo::$barпотому что переводчик затем принимает во вниманиеBar учебный класс.

Обычно вы используете поздние статические привязки для методов или даже самого класса, а не для свойств, так как вы часто не декларируете свойства в подклассах; пример использованияstatic Ключевое слово для вызова конструктора с поздней привязкой можно найти в этом связанном вопросе:Новая личность против новой статики

Однако это не исключает использованияstatic со свойствами, а также.

Ах хорошо. в этом есть смысл. благодарю вас cwd
Вы можете очень легко переопределить в дочернем классе, родительский класс может быть значением по умолчанию, которое дочерний класс использует, если они не объявлены повторно. Если вы находитесь в родительском классе, я думаю, что безопасно использовать self ::, а если в дочернем классе, вы можете придумать аргумент для использования любого из них, но self :: также будет работать, если вы не ожидаете объявлять когда-либо.

Похожие вопросы