Статическое наследование до PHP 5.3 - PullRequest
3 голосов
/ 21 декабря 2011
class A
{
    static $v = "A";

    static function echoExtendedStaticVariable() {
        echo self::$v;
    }
}

class B extends A
{
    static $v = "B";
    // override A's variable with "B"
}

Почему:

echo B::$v

печатает "A"?

И как мне заставить его печатать "B"?

Есть ли способ сделать это до PHP 5.3?

Ответы [ 2 ]

6 голосов
/ 21 декабря 2011

B->echoExtendedStaticVariable() == 'A' потому что self:: оценивается в время компиляции , а не время выполнения. Это как если бы вы написали A:: вместо self::.

Вам нужна функция, называемая «поздняя статическая привязка» - она ​​«поздняя», потому что она может определять класс во время выполнения, а не во время компиляции.

Вы можете эмулировать это (вроде) в PHP 5.2, используя ReflectionClass:

class A
{
    static $v = "A";
    function echoExtendedStaticVariable() {
        $rc = new ReflectionClass($this);
        echo $rc->getStaticPropertyValue('v');
    }
}
class B extends A
{
    static $v = "B";
}
$b = new B();
$b->echoExtendedStaticVariable(); // B

Обратите внимание, что вы можете сделать это, только если у вас есть доступ к экземпляру, поэтому вы не можете сделать echoExtendedStaticVariable статическим методом и ожидать, что это сработает.

2 голосов
/ 21 декабря 2011

Нет способа сделать это легко в PHP 5.2 (то есть: без явной переопределения каждого метода).

Когда вы вызываете B::echoExtendedStaticVariable, он переходит к A::echoExtendedStaticVariable, область видимости меняется на однуA и все привязки около B исчезли.Никаких следов, никаких отражений, никаких магических констант, ничего: все это указывает на A.

По моему мнению, статических членов следует избегать, если в этом нет особой необходимости, и это редко случается.Это делает ваш код трудным для расширения, поскольку внедрение зависимостей ограничено, а подстановка практически невозможна (за исключением анти- шаблонов, таких как Singleton).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...