这是代码示例。在PHP 5.6,PHP 7.3中进行了测试。
class a {
static public $prop = 'in a';
}
class b extends a {
}
a::$prop = 111;
b::$prop = 777;
print_r(a::$prop);
您认为我们会得到什么?
a::prop = 777 (!!!)
那怎么样?
我知道后期静态绑定主体,但有人可以指出 我是从理论上解释这种行为的?
JAVA的行为是否相同?
Python的行为是否相同?
谢谢。
[解决方案]
请,在下面查看我的评论:https://stackoverflow.com/a/59300364/3142281
答案 0 :(得分:2)
实际上,这与后期静态绑定无关。当具有相同名称的属性或函数位于不同层次结构上时,就会发生LSB。
由于类b
在访问$prop
时未定义其自己的静态变量b::$prop
,因此您访问了变量a::$prop
,实际上是访问变量a::$prop
。在这种情况下,b::$prop
和run
都引用相同的变量。
是的,JAVA的行为方式相同。我不知道它在Python中如何工作,但我希望得到同样的结果。
答案 1 :(得分:0)
[解决方案]
我自己找到了解决方案! 请在这里查看评论: https://www.php.net/manual/en/language.oop5.traits.php#107965
与继承不同;如果特征具有静态属性,则每个类使用 该特征具有这些属性的独立实例。
更多单词... 因此,您可能可以想象,如果我们总是被迫重新定义静态字段,并且每次都扩展,则会出现什么继承问题。 特质似乎可以解决这个问题。