让我们从一些代码开始:
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 关键字的后期静态绑定对静态方法非常有用,所以我认为它会对静态变量做同样的魔术。好吧,似乎没有。上面的示例不打印出“红色”,然后打印出“绿色”,正如我的预期,但“绿色”和“绿色”。为什么当它适用于方法时,它是否适用于变量?有没有其他方法可以达到我预期的效果?
答案 0 :(得分:12)
后期静态绑定仅适用于变量/方法的新定义。因此,在您的示例中,$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