我正在围绕“static ::”关键字开发一些PHP,并遇到一个问题,即太多的静态调用会导致方法所在的位置混淆。通过示例显示更容易:
class Class1
{
function Test()
{
return Class2::Test();
}
}
class Class2
{
function Test()
{
return static::Test2();
}
function Test2()
{
return true;
}
}
/* test 1: calling Class1::Test() statically results in expected call to Class2::Test2() */
echo "test 1: " . Class1::Test() . "\n";
/* test 2: instantiating the class causes Class1::Test2() to be called, which does not exist */
$Class1 = new Class1();
echo "test 2: " . $Class1->Test() . "\n";
我想联系并获得PHP专家的意见,他们可以告诉我这可能是一个真正的错误还是简单的滥用语言。
我意识到所有静态调用的设置可能都很奇怪,但它代表了我遇到的实际代码。
如果需要更多信息或说明,请与我们联系。感谢您提前提供任何帮助!
答案 0 :(得分:7)
late static bindings上的PHP文档回答了您的问题。
“后期静态绑定通过存储在最后一次”非转发调用“中命名的类来工作。在静态方法调用的情况下,这是显式命名的类(通常是::运算符左侧的那个);在非静态方法调用的情况下,它是对象的类。“转发调用”是由self ::,parent ::,static ::“...
引入的静态调用。
您的测试1是静态调用,因此在调用Class2::Test()
时,它会存储Class2。静态test2调用引用Class2
中的正确位置。
您的测试2是非静态调用,因此它在所有情况下都使用对象的类,并且由于它是Class1
,因此无法找到方法Test2
。