这是代码示例。在 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
实际上这与后期静态绑定无关。当您在不同层次结构级别上具有相同名称的属性或函数时,可能会发生 LSB。
由于类b
没有定义自己的静态变量$prop
当您访问b::$prop
时,您会失败,实际上访问变量a::$prop
。在这种情况下,a::$prop
和b::$prop
都引用同一个变量。
是的,JAVA的行为方式相同。我不知道它在 Python 中是如何工作的,但我期待同样的结果。
[解决方案]
我自己找到了解决方案! 请在此处查看评论: https://www.php.net/manual/en/language.oop5.traits.php#107965
与继承不同;如果特征具有静态属性,则每个类使用 该特征具有这些属性的独立实例。
再说几句... 所以,你大概可以想象,如果我们总是被迫重新定义静态字段,每次都扩展,会出现什么样的继承问题。 特质似乎可以非常简洁地解决这个问题。