PHP5.3 : "Call to undefined method" error when calling invoke from class variable

标签 php methods invoke

我一直在用 __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/

相关文章:

javascript - 如果在 Codeigniter 中使用 Jquery 禁用它们,如何获取单选按钮的值?

javascript - laravel 在一个页面中实现两个脚本

php - Upstart 的 Yii 控制台给我错误

javascript - jquery中通过循环获取值

r - S4 设置 <- 方法错误。没有现有的函数定义

java - 方法引用

c# - 在一种方法中使用在另一种方法中启动的类

c# - MethodInvoker 与 Control.BeginInvoke 的操作

c# - 通过字符串调用实例类的方法

c# - Task.Run 与 Invoke() 区别