如何通过构造函数为PHP类添加可回调方法?
问题解决:PHP类中回调属性调用错误的修复方案
错误原因
你遇到的Call to undefined method Action::callback()错误,是因为把类的公共属性callback当成了方法来调用。$action->callback是存储回调函数的属性,不是类的成员方法,直接用()调用会被PHP识别为调用不存在的方法。
修复方案
方案1:直接调用属性中的回调函数
可以通过PHP内置函数call_user_func/call_user_func_array,或者PHP 7+支持的直接函数式调用语法来执行属性里的回调:
// 原Action类保持不变 class Action { public $callback = null; public function __construct(callable $callback) { $this->callback = $callback; } } // 调用方式1:使用call_user_func $action = new Action(function($value) { echo "处理值:{$value}"; }); call_user_func($action->callback, 'abc'); // 调用方式2:PHP 7+ 直接执行属性中的回调 ($action->callback)('abc');
方案2:封装回调调用方法(推荐)
更符合面向对象封装原则的做法是,给Action类添加一个专门的方法来执行回调,避免直接操作公共属性:
class Action { // 将属性改为私有,提升安全性 private $callback = null; public function __construct(callable $callback) { $this->callback = $callback; } // 添加执行回调的方法,支持传入任意参数 public function run(...$arguments) { if (!is_callable($this->callback)) { throw new RuntimeException("回调函数不可调用"); } return call_user_func_array($this->callback, $arguments); } } // 调用方式 $action = new Action(function($value) { echo "处理值:{$value}"; }); $action->run('abc');
这种方式不仅避免了属性和方法的混淆,还能在执行前做合法性校验,让代码更健壮。
内容的提问来源于stack exchange,提问作者Cam Parry
相关产品推荐
相关产品推荐

