PHP将语言结构与魔术方法结合使用

时间:2015-12-18 10:25:56

标签: php

这个question让我对使用语言结构和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()却没有?

由于php reserved keywords两者都会失败?

3 个答案:

答案 0 :(得分:3)

更新PHP 7

PHP 7解决了所描述的行为,并实现了一个名为上下文敏感词法的功能,由marcio提出。

您的代码只能与PHP 7一起使用。

PHP 7之前的情况

在PHP甚至意识到某个方法可以通过__callStatic()获得之前,会抛出语法错误,它发生在解析阶段。

您描述的行为似乎是PHP解析器中的错误,至少应该在文档中描述不一致。

我会file a bug report。好抓!

更新:OP已提交错误报告,可在此处找到:https://bugs.php.net/bug.php?id=71157

答案 1 :(得分:3)

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

这是经过批准的RFC进行了更改:https://wiki.php.net/rfc/context_sensitive_lexer

您可以在以下(非官方)PHP 7参考中获得有关新功能和重大更改的更多信息:https://github.com/tpunt/PHP7-Reference#loosening-reserved-word-restrictions

答案 2 :(得分:0)

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

如果您将Testing::list();替换为call_user_func_array(['Testing', 'list'], []);,则按预期工作。