结合使用语言构造和魔术方法的PHP
这让我对将语言结构与PHP的神奇方法结合使用感到好奇。我创建了一个演示代码:结合使用语言构造和魔术方法的PHP,php,Php,这让我对将语言结构与PHP的神奇方法结合使用感到好奇。我创建了一个演示代码: <?php class Testing { public function scopeList() { echo "scopeList"; } public function __call($method, $parameters) { if($method == "list") { $this->scopeList();
<?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'}()整个问题可以缩减到最后两段。通读和理解这个代码示例真的没有任何意义。@deceze也许可以。但我认为,为了清楚起见,这里举个例子是有意义的?我想展示一下,在这个例子中,神奇的方法是如何工作的……我想最终的答案可以归结为:PHP,叹气,amirite?!;)仅供参考,这里有一个PHP聊天室,所以我建议在报告“bug”之前询问一下。感谢您的输入。我一直认为这可能是解析器中的一个bug,但我不知道这一点。不客气!再一次,接得好。不幸的是,(PHP)程序员除了避免使用保留的关键字之外,在这里什么都做不了。我想听听PHP核心开发人员对此的意见,我的意思是他们是否会去修复它,或者说在那种情况下不要使用list
。是的,我对这种东西感兴趣;)否则我就不会研究了。我已经提交了一份bug报告,但仅限于“文档问题”的情况。我认为这不是一个“真正的”错误,而是一个不一致的错误。你能给我的答案添加链接吗?@Danack虽然我不会说Stackoverflow上的PHP聊天室是报告PHP错误之前需要询问的最终实例,但我同意它在这种情况下会有所帮助。哦,我不知道。这应该是公认的答案。感谢您提供的信息;)然而,PHP7.0是因为托管restsrictions对我来说还不是一个选择(可能对许多其他人也是如此)。正如我所说的,我知道保留关键字的限制,但OP中的情况看起来很奇怪,在我看来并不一致。