如前所述on Reddit's LOL PHP sub , PHP 7 在引用 self
时可以使用扩展类或基类,而 PHP 5 总是引用扩展类。
<?php
class Foo {
const A = "FooA";
const B = self::A . self::C;
const C = "FooC";
}
class Bar extends Foo {
const A = "BarA";
const C = "BarC";
}
var_dump(Bar::B);
PHP 5
string(8) "BarABarC"
PHP 7
string(8) "FooABarC"
PHP 7 的行为尤其令人担忧,因为似乎没有任何简单的规则可以知道 self
何时引用基类或扩展类。 在 PHP 7 中确定 self
将引用哪个类的规则是什么?
最佳答案
self::
应该 始终引用它在其中使用的类(注意 PHP 5 的行为也是错误的。)
这是一个 bug , fixed在 7.1.4 , 这仅适用于类常量内的 self::
和 parent::
的解析。
基本上在:
const B = self::A . self::C;
self::C
此时仍然未知,推迟解决。不幸的是,在最终解决时,正确的范围丢失了。
这个问题也比简单的基类与扩展类更微妙,因为您最终可能会得到一个不同扩展类的值。例如:
class A {
const selfN = self::N;
const N = 'A';
}
class B extends A {
const N = 'B';
}
class C extends A {
const N = 'C';
}
var_dump(B::selfN); // A
var_dump(C::selfN); // A
在 PHP 7.0.0 到 7.1.3 中输出:
string(1) "B"
string(1) "B"
虽然如果你把它换成:
var_dump(C::selfN); // A
var_dump(B::selfN); // A
你会得到:
string(1) "C"
string(1) "C"
为了在受影响的版本中避免这种情况,在类常量定义中使用类名而不是 self::
,例如const selfN = A::N
关于php - PHP 7 的 self 在什么情况下引用基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020071/