结合使用语言构造和魔术方法的PHP

结合使用语言构造和魔术方法的PHP,php,Php,这让我对将语言结构与PHP的神奇方法结合使用感到好奇。我创建了一个演示代码: <?php class Testing { public function scopeList() { echo "scopeList"; } public function __call($method, $parameters) { if($method == "list") { $this->scopeList();

这让我对将语言结构与PHP的神奇方法结合使用感到好奇。我创建了一个演示代码:

<?php
class Testing {

    public function scopeList() {
        echo "scopeList";
    }

    public function __call($method, $parameters) {
        if($method == "list") {
            $this->scopeList();
        }
    }

    public static function __callStatic($method, $parameters) {
        $instance = new static;
        call_user_func_array([$instance, $method], $parameters);
    }
}

//Testing::list();
$testing = new Testing();
$testing->list();

在我看来,这是因为保留字


如果替换
Testing::list()使用
调用用户函数数组(['Testing','list',[])它按预期工作。

更新PHP7

PHP7解决了所描述的行为,并实现了一个名为上下文敏感lexer的特性,该特性由提出

您的代码只需使用PHP7即可


PHP 7之前的情况

PHP甚至在意识到通过
\uu callStatic()
可以使用某个方法之前就会抛出语法错误,这发生在解析阶段

您描述的行为似乎是PHP解析器中的一个bug,至少是文档中应该描述的不一致性

我会的。接得好



更新:OP文件中有一个bug报告,可以在这里找到:

PHP 7.0+现在支持上下文敏感标识符,您的代码可以正常工作。更新PHP可以解决这个问题

这是进行更改的已批准RFC:


您可以在以下(非官方)PHP7参考资料中获得有关新功能和突破性更改的更多信息:

我熟悉保留字,这就是我将该链接发布到PHP文档的原因。但为什么静态调用list()会失败,而在实际对象上调用list则不会失败呢?__callStatic()魔术方法应该可以处理这个问题。虽然它确实不是问题的答案,但我还是支持它,因为它提供了一个解决方法,其他人可能会对此感兴趣。尽管它是这样工作的:
测试::{'list'}()list
。是的,我对这种东西感兴趣;)否则我就不会研究了。我已经提交了一份bug报告,但仅限于“文档问题”的情况。我认为这不是一个“真正的”错误,而是一个不一致的错误。你能给我的答案添加链接吗?@Danack虽然我不会说Stackoverflow上的PHP聊天室是报告PHP错误之前需要询问的最终实例,但我同意它在这种情况下会有所帮助。哦,我不知道。这应该是公认的答案。感谢您提供的信息;)然而,PHP7.0是因为托管restsrictions对我来说还不是一个选择(可能对许多其他人也是如此)。正如我所说的,我知道保留关键字的限制,但OP中的情况看起来很奇怪,在我看来并不一致。