为什么';PHP5.3中的变量静态绑定工作是否很晚?
让我们从一些代码开始:为什么';PHP5.3中的变量静态绑定工作是否很晚?,php,variables,inheritance,static,late-static-binding,Php,Variables,Inheritance,Static,Late Static Binding,让我们从一些代码开始: 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 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();
现在,PHP5.3中使用static关键字的后期静态绑定对于静态方法非常有效,因此我假设它对静态变量也会起到同样的作用。嗯,看来不是。上面的例子并没有像我最初预期的那样先打印“红色”再打印“绿色”,而是打印“绿色”和“绿色”。当它在方法上工作时,为什么它在变量上不工作?有没有其他方法可以达到我预期的效果?后期静态绑定只适用于变量/方法的新定义。因此,在您的示例中,
Super
的$color
属性将始终被修改,而不是ChildA
或ChildB
。要使用后期静态绑定,需要使用static
关键字,而不是self
。此外,您需要重新定义ChildA
和ChildB
类的$color
属性:
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
非常感谢,莱肯斯汀。这确实有点破坏了继承的舒适感,但我会设法:)谢谢这真的很有帮助。我也落入了同样的陷阱;我没有在子类中重新定义变量!你有没有关于这方面的文献,因为我似乎错过了PHP文档中的这一重要部分。