Почему поздняя статическая привязка не работает с переменными в 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