这个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两者都会失败?
答案 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'], []);
,则按预期工作。