不能在另一个对象中使用invoke magic方法
我经历过一些我认为是错误的东西,但我不确定。 所以我来这里问问那些比我更了解这些的人,这是一个PHP错误吗? 看看以下几行:
<h1>Tests</h1>
<?php
class Foo
{
public function __invoke()
{
return 'Called correctly';
}
}
class Boo
{
public function __construct()
{
$this->Foo = new Foo();
}
}
$Foo = new Foo();
echo $Foo();
echo "<br><br><hr><br><br>";
$Boo = new Boo();
echo $Boo->Foo();
根据规范,由于The __invoke() method is called when a script tries to call an object as a function
,所以我应该获得这个:
调用正确
调用正确
但最后的回声未被执行。 相反,我得到这个:
PHP致命错误:调用第26行的[...] / index.php中的未定义方法Boo :: Foo()
这是一个错误还是预期的行为? 如果这是一个错误,一些关于如何提交它的帮助将不胜感激。
基于乔恩的编辑回答显示进一步丑陋的行为
class Doo
{
public function __construct()
{
// The Foo class is the same as the one defined before
$Test = new Foo();
echo $Test(); // Echos correctly
echo "<br><br><hr><br><br>";
$this->Foo = $Test;
echo $this->Foo(); // Error. Heisenbehaviour?
}
}
$Boo = new Doo();
这不是一个bug,它不限于Foo
是一个定义__invoke
的对象。 你会得到任何可调用的错误:
class Foo
{
private $bar = 'rand';
public function __construct()
{
$this->bar(); // won't work
}
}
你需要把它写成两行,或者使用call_user_func
:
// #1
$Boo = new Boo();
$Foo = $Boo->Foo;
$Foo();
// #2
$Boo = new Boo();
call_user_func($Boo->Foo);
另请参阅类变量函数
它有完全相同的问题。 PHP词法分析器始终将语法variable T_OBJECT_OPERATOR T_STRING function_call_parameter_list
识别为方法调用。