PHP5.3:从类变量调用invoke时“调用未定义的方法”错误
发布时间:2020-12-13 16:00:38 所属栏目:PHP教程 来源:网络整理
导读:我一直在用__invoke魔术方法做一些测试(替换旧代码),我不确定这是不是一个bug: 让我们假设我们有一个班级: class Calc { function __invoke($a,$b){ return $a*$b; }} 以下是可能的,并且没有任何问题: $c = new Calc;$k = $c;echo $k(4,5); //outputs 20
我一直在用__invoke魔术方法做一些测试(替换旧代码),我不确定这是不是一个bug:
让我们假设我们有一个班级: 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来“转发”调用,但这并不优雅. 我需要将该实例保留在公共类中(出于设计目的)并能够将其作为函数从其他类中调用…任何建议? 更新: 我找到了一些有趣的东西(至少对我而言): 如果我们将“类变量”分配给局部变量,它可以工作: $t = new Test; $m = $t->k; echo $m(4,5);
当你执行$test-> k()时,PHP认为你在$test实例上调用了一个方法.由于没有名为k()的方法,PHP会引发异常.你要做的是让PHP返回公共属性k并调用它,但为此你必须先将k赋给变量.这是一个解除引用的问题.
您可以将magic __call方法添加到Test类中,以检查是否存在具有被调用方法名称的属性,并调用该方法: public function __call($method,$args) { if(property_exists($this,$method)) { $prop = $this->$method; return $prop(); } } 我将调用的参数添加到您. 但无论如何,那么你可以做到 $test->k(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |