如何将对象方法作为引用传递给接收callback参数的函数
PHP中将方法/对象属性作为回调传递的实现方法
完全可以实现,PHP原生支持多种可调用(callable)类型的传递,你给出的示例仅因为属性名书写错误(定义的是f属性,调用时写的是a)无法运行,修正后即可正常执行。
1. 对象属性为闭包的场景
对应你给出的示例逻辑,修正后代码如下:
function ex($callback){ $callback(); } $obj = (object) ['f' => function(){echo "hello";}]; // 直接传递对应闭包属性即可 ex($obj->f); // 运行后输出 hello
如果需要做兼容性判断,可以先用is_callable($obj->f)判断属性是否为合法可调用结构后再传递。
2. 对象为类实例、传递普通公有方法的场景
如果你的复杂对象是类实例,要传递的是类中定义的普通方法(不是存为属性的闭包),可以使用PHP官方指定的数组格式回调[$实例对象, '方法名'],这种方式会自动绑定原对象的上下文,内部的$this指向不会改变,完全兼容带内部参数的复杂对象场景:
// 自定义复杂类 class MyService { // 内部自定义参数 private string $appName = "测试应用"; public function sayHi(): void { echo "欢迎来到" . $this->appName; } } function ex($callback){ $callback(); } $obj = new MyService(); // 传递数组格式的回调 ex([$obj, 'sayHi']); // 运行后输出 欢迎来到测试应用
注意:如果要传递的是类的私有/受保护方法,只能在类的内部作用域使用上述数组形式的回调,外部调用会抛出不可调用的错误。
3. 需提前绑定参数的场景
如果需要给回调提前固定部分参数,不需要修改回调接收函数的逻辑,可以用箭头函数或者闭包包一层处理:
function ex($callback){ // 回调接收方仅传入1个参数 echo $callback("小明"); } class MyService { public function greet(string $prefix, string $name): string { return $prefix . "," . $name; } } $obj = new MyService(); // 提前固定第一个参数为"早上好" ex(fn($name) => $obj->greet("早上好", $name)); // 运行后输出 早上好,小明
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

