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

Jef*_*f V 6 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";
Run Code Online (Sandbox Code Playgroud)

我想联系并获得PHP专家的意见,他们可以告诉我这可能是一个真正的错误还是简单的误用语言.

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

如果需要更多信息或说明,请与我们联系.在此先感谢您的帮助!

Tes*_*rex 7

关于后期静态绑定的PHP文档可以回答您的问题.

.非转发呼叫'在静态方法调用的情况下,"后期静态绑定表通过存储在最后定名为类工作’,这是明确指定的类(通常在::运算符左侧的一个);在情况非静态方法调用,它是对象的类."转发调用"是由self ::,parent ::,static ::"...引入的静态调用.

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

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