Задать вопрос

Тонкость Late Static Binding в PHP

Late Static Binding это штука, появившаяся в php 5.3. И вроде бы довольно понятная и логичная. Но в приведенной выше ссылке есть буквально одно предложение, которое ставит меня в тупик:

Some people describe static:: as the $this-> resolution for static calls, this is not true as $this-> follows the rules of inheritance while static:: doesn't.

Ведь по смыслу вроде бы как и получается, что static:: обращения это тоже самое this, только для статичных членов класса, то есть то какой будет выбран класс — потомок или родитель, решается непосредственно при исполнении. А умные люди пишут, что static:: «не следует правилам наследования». Что же это за правила наследования? Как следует понимать эту фразу?
  • Вопрос задан
  • 3925 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
taliban
@taliban
php программист
Подозреваю что этих:
Class A
{
    static protected $_a = 'a';

    static public function showA()
    {
        echo self::$_a;
    }
}

class B extends A
{
    static protected $_a = 'b';
}

B::showA();
Ответ написан
okneigres
@okneigres
Скорее, имеется в виду, что если у вас есть наследование A1-> A2 -> A3 и вы сконструировали объект A3, то может сложиться ситуация, что в методе класса A1 есть $this (A3), но static:: будет указывать на A2.
Ответ написан
Ниже же как раз разъясняющий пример идёт. Вызываем через наследника метод, который вызывает через static метод родителя, который не переопределён в наследнике. Метод вызывается в контексте родителя, а не наследника. Т.е. echo __CLASS__ — показывает класс, в котором определён метод, а не тот, через который он был вызван.

А не тот ли это кролик «Зайчик-зайчик, скок-поскок...»?
Ответ написан
Выше был не прав, ничего тот пример не поясняет. Я всяко разно писал код, строил предположения… но ничего у меня не получилось, чтобы наследование работало как-то не так.

Но у меня есть ещё одно предположение: этот чувак не прав.
Ответ написан
@shagguboy
помоему в мануале
www.php.net/manual/en/language.oop5.late-static-bindings.php
все описано гораздо понятней
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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