Почему поздняя статическая привязка не работает с переменными в PHP 5.3? - PullRequest
7 голосов
/ 14 мая 2011

Давайте начнем с некоторого кода:

class Super {

    protected static $color;

    public static function setColor($color){
        self::$color = $color;
    }

    public static function getColor() {
        return self::$color;
    }

}

class ChildA extends Super { }

class ChildB extends Super { }

ChildA::setColor('red');
ChildB::setColor('green');

echo ChildA::getColor();
echo ChildB::getColor();

Теперь поздняя статическая привязка в PHP 5.3 с использованием ключевого слова static прекрасно работает со статическими методами, поэтому я предположил, что она будет использовать то же самое для статических переменных. Ну, кажется, нет. В приведенном выше примере печатается не «красный», а затем «зеленый», как я и ожидал, но «зеленый» и «зеленый». Почему это не работает с переменными, когда работает с методами? Есть ли другой способ добиться ожидаемого эффекта?

1 Ответ

12 голосов
/ 14 мая 2011

Позднее статическое связывание будет работать только для новых определений переменных / методов. Таким образом, в вашем примере свойство $color Super всегда будет изменено вместо ChildA или ChildB. Чтобы использовать позднюю статическую привязку, вам нужно использовать ключевое слово static вместо self. Кроме того, вам необходимо переопределить свойство $color ваших классов ChildA и ChildB:

class Super {

    protected static $color;

    public static function setColor($color){
        // static instead of self
        static::$color = $color;
    }

    public static function getColor() {
        // static instead of self
        return static::$color;
    }

}

class ChildA extends Super {
    protected static $color;
}
class ChildB extends Super {
    protected static $color;
}

ChildA::setColor('red');
ChildB::setColor('green');

echo Super::getColor(); // prints nothing (NULL = ''), expected
echo ChildA::getColor();// prints red
echo ChildB::getColor();// prints green
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...