PHP8中如何将类方法作为参数传递给跨文件公共函数并正确调用
问题根因
你当前的写法存在参数求值顺序问题:调用doThis($this->bar())时,PHP会先执行$this->bar()直接输出foo,再将bar()的返回值(该方法无显式return,默认返回null)传入doThis。call_user_func(null)不会触发任何执行逻辑,因此最终仅输出foo。
PHP8下的修复方案
你需要向doThis传入可调用类型的参数,而非直接执行方法后的返回值,有两种常用写法:
写法1:通用可调用数组(兼容所有PHP7+、PHP8版本)
修改Foo类的test方法即可:
class Foo { public function test() { // 传入实例方法的可调用结构:[实例, 方法名] doThis([$this, 'bar']); } public function bar() { echo 'foo'; } }
写法2:一阶可调用语法(仅支持PHP8.1及以上版本)
语法更简洁,也能明确传递方法引用:
public function test() { doThis($this->bar(...)); }
修改后执行逻辑完全符合预期:doThis被调用时先输出this must run,再通过call_user_func执行bar方法输出foo。
内容的提问来源于stack exchange,提问作者Radical_Activity
相关产品推荐
相关产品推荐

