PHP5:将匿名函数作为类属性调用时出现错误的问题
解决PHP类中匿名函数属性无法调用的问题
这个问题我之前踩过坑!本质是PHP的语法解析优先级在搞鬼——当你写$this->f($a)的时候,PHP会默认把f当成类的方法名去查找,而不是去读取$f属性里存储的匿名函数,所以才会抛出“Call to undefined method MyClass::f()”的错误。
下面给你三种可行的解决方案,覆盖不同PHP版本:
方案1:先把属性赋值给临时变量(兼容所有PHP版本)
先把$this->f这个闭包赋值给一个普通变量,再调用变量,这样PHP就不会把它当成类方法了:
class MyClass { public $f; public function __construct($f) { $this->f = $f; } public function methodA($a) { $func = $this->f; echo $func($a); // 正常输出5 } }
方案2:使用call_user_func()函数(兼容所有PHP版本)
PHP内置的call_user_func()可以直接调用可调用对象(包括闭包),完美适配这种场景:
class MyClass { public $f; public function __construct($f) { $this->f = $f; } public function methodA($a) { echo call_user_func($this->f, $a); // 正常输出5 } }
如果需要传递多个参数,可以用call_user_func_array(),把参数放到数组里传进去即可。
方案3:PHP 7+专属语法:用括号包裹属性访问
PHP 7及以上版本支持直接用括号强制解析顺序,先获取属性里的闭包,再调用它,写法最简洁:
class MyClass { public $f; public function __construct($f) { $this->f = $f; } public function methodA($a) { echo ($this->f)($a); // 正常输出5 } }
括号的作用是告诉PHP:“先把$this->f的值取出来,再调用这个值”,这样就不会和类方法混淆了。
测试的时候,原来的调用代码不变:
$f = function($v) { return $v + 1; }; $myObject = new MyClass($f); $myObject->methodA(4); // 输出5
内容的提问来源于stack exchange,提问作者ma77c
相关产品推荐
相关产品推荐

