PHP5.3.3中可能存在的关于static::的PHP错误

PHP5.3.3中可能存在的关于static::的PHP错误,php,static,Php,Static,我当时正在研究一些PHP中的“static::”关键字,遇到了一个问题,即太多的静态调用会导致对方法所在位置的混淆。通过示例更容易显示: class Class1 { function Test() { return Class2::Test(); } } class Class2 { function Test() { return static::Test2(); } function Test2()

我当时正在研究一些PHP中的“static::”关键字,遇到了一个问题,即太多的静态调用会导致对方法所在位置的混淆。通过示例更容易显示:

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专家,征求他们的意见,他们可以告诉我这可能是一个真正的bug,还是对该语言的简单误用

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

如果需要更多信息或澄清,请告诉我。提前谢谢你的帮助

上面的PHP文档将回答您的问题

“后期静态绑定通过存储上次“非转发调用”中命名的类来工作。对于静态方法调用,这是显式命名的类(通常是::运算符左侧的类);对于非静态方法调用,这是对象的类。“转发调用”“是由self:,parent:,static:”引入的静态文件

测试1是一个静态调用,因此当调用
Class2::test()
时,它存储Class2。静态test2调用引用
Class2
中的正确位置


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

您使用的是什么版本的PHP?static关键字直到5.3才扩展。我想他是在问这是否真的是一个带有static关键字的bug,以及整个后期的统计结果如何绑定的东西是“假定的”“为了工作。我忘了提到,运行5.3.3汉克斯作为参考,我可以看到他们在文档中特别描述了这个实例。但是,现在我想知道这是否是一个应该报告的bug?想法?@Jeff为什么会是虫子?看来这正是他们想要的。你期望什么样的行为?为什么它更正确?(您还必须在bug报告中向他们解释这一点。)首先,很抱歉,我对PHP内部工作的了解不如这里的许多人。在我的示例中,代码希望通过$Class1->Test()->Class2::Test()->Class2::Test()->Class2::Test()从Class2::Test2()获得结果。这是一个合理的期望吗?@Jeff在这种情况下,Class2的测试应该使用
self::
而不是
static::
。我最终使用的是文字类名,例如Class2::Test2()而不是static::Test2()。使用self::也有效。我很好奇这是否是需要在PHP中解决的问题,但这里可能不会讨论这个问题。如果你们都想讨论,我很乐意参加。否则,非常感谢您的帮助!