在PHP 5.3.3中围绕static ::可能存在的PHP错误

时间:2011-06-01 19:13:36

标签: php static

我正在围绕“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专家的意见,他们可以告诉我这可能是一个真正的错误还是简单的滥用语言。

我意识到所有静态调用的设置可能都很奇怪,但它代表了我遇到的实际代码。

如果需要更多信息或说明,请与我们联系。感谢您提前提供任何帮助!

1 个答案:

答案 0 :(得分:7)

late static bindings上的PHP文档回答了您的问题。

  

“后期静态绑定通过存储在最后一次”非转发调用“中命名的类来工作。在静态方法调用的情况下,这是显式命名的类(通常是::运算符左侧的那个);在非静态方法调用的情况下,它是对象的类。“转发调用”是由self ::,parent ::,static ::“...

引入的静态调用。

您的测试1是静态调用,因此在调用Class2::Test()时,它会存储Class2。静态test2调用引用Class2中的正确位置。

您的测试2是非静态调用,因此它在所有情况下都使用对象的类,并且由于它是Class1,因此无法找到方法Test2