我一直在用 __invoke 魔术方法做一些测试(以替换旧代码),但我不确定这是否是错误:
假设我们有一个类:
class Calc {
function __invoke($a,$b){
return $a*$b;
}
}
以下是可能的并且没有任何问题:
$c = new Calc;
$k = $c;
echo $k(4,5); //outputs 20
但是如果我想要另一个类来存储该对象的实例, 这不起作用:
class Test {
public $k;
function __construct() {
$c = new Calc;
$this->k = $c; //Just to show a similar situation than before
// $this-k = new Calc; produces the same error.
}
}
当我们尝试像这样调用它时会发生错误:
$t = new Test;
echo $t->k(4,5); //Error: Call to undefined method Test::k()
我知道“解决方案”可能是在类 Test(名为 k)中有一个函数来使用 call_user_func_array 来“转发”调用,但这并不优雅。
我需要将该实例保留在一个公共(public)类中(出于设计目的),并能够将其作为其他类中的函数调用...有什么建议吗?
更新:
我发现了一些有趣的东西(至少对我来说是这样):
如果我们将“类变量”分配给一个局部变量,它就起作用了:
$t = new Test;
$m = $t->k;
echo $m(4,5);
最佳答案
当您这样做时,PHP 认为您想在实例 $t 上调用方法 k:
$t->k(4, 5)
这是完全合理的。您可以使用中间变量来调用对象:
$b = $t->k;
$b(4, 5);
另见 bug #50029 ,它描述了您的问题。
关于PHP5.3 : "Call to undefined method" error when calling invoke from class variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3108070/