Родительская статическая функция, вызывающая статическую дочернюю переменную - PullRequest
2 голосов
/ 04 июня 2011

Вот упрощенная версия классов, с которыми я имею дело

class A {
   static protected function getVal() {
              return self::$valB;
            }
}
class B extend A {
   static protected $valB = 'Hello';
}
B::getVal(); // Hello

Должно ли это работать в php версии 5.2.17 или неправильно настроено.В настоящее время я получаю сообщение о том, что не могу найти A::$valB.

Ответы [ 2 ]

3 голосов
/ 04 июня 2011

Требуется позднее статическое связывание, которое присутствует в PHP 5.3.0 и более поздних версиях.

http://us3.php.net/manual/en/language.oop5.late-static-bindings.php

В getVal вы хотите использовать return static::valB; вместо return self::valB;

1 голос
/ 04 июня 2011

Во-первых, ваш синтаксис кода неправильный.Начните с исправления:

class A {
   static protected function getVal() {
       return self::$valB;
   }
}
class B extends A {
   static protected $valB = 'Hello';
}
B::getVal();

Теперь это никогда не будет работать, потому что getVal защищено.Если вы не позвоните по номеру A или одному из его дочерних элементов, он не будет работать.

Ключевое слово self преобразуется в вызывающий его класс.Поскольку self используется в A: self == A.

Вам потребуется использовать поздние статические привязки, чтобы исправить это:

return static::$valB;

Наконец, я бы порекомендовал вам такжеобъявите $valB в A, чтобы избежать фатальных ошибок:

class A {
    static protected $valB;
    static protected function getVal() { ... }
}
...