我经历过一些事情,我认为这是一个错误,但我不确定。所以我来这里问比我更了解这个问题的人,这是一个 PHP bug 吗?看看下面几行:
<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 specification ,由于当脚本尝试将对象作为函数调用时调用 __invoke() 方法
,我应该获得以下内容:
Called correctly
Called correctly
但是最后一个echo没有执行。相反,我得到这个:
PHP Fatal error: Call to undefined method Boo::Foo() in [...]/index.php on line 26
这是一个错误还是预期的行为?如果这是一个错误,我们将非常感谢有关如何提交它的一些帮助。
根据乔恩的回答进行编辑,以进一步展示丑陋的行为
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();
最佳答案
这不是一个错误,并且不限于 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 - 无法在另一个对象中使用调用魔术方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888994/