Почему поздняя статическая привязка не работает с переменными в PHP 5.3?
давайте начнем с некоторого кода:
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 с использованием статический ключевое слово отлично работает со статическими методами, поэтому я предположил, что оно будет делать ту же магию со статическими переменными. Похоже, что нет. Приведенный выше пример не печатает "красный", а затем" зеленый", как я сначала ожидал, а" зеленый "и"зеленый". Почему это не работает с переменными, когда оно работает с методами? Есть ли другой способ добиться ожидаемого эффекта?
1 ответов
поздняя статическая привязка будет работать только для новых определений переменных / методов. Таким образом, в вашем примере $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