PHP如何调用对象中含变量部分的成员函数?
解决PHP中动态调用链式对象方法的问题
嘿,我明白你要做的事——想用变量代替链式调用里的somefunction方法名对吧?之前的写法不对是因为PHP没法把你拼接的字符串解析成有效的对象调用,给你两种在PHP7.2里完全可行的方案:
方案一:花括号包裹变量(最简洁)
这是最直接的写法,只需要把变量用{}包起来,让PHP先解析变量的值,再作为方法名调用:
$var = 'somefunction'; $someobject = getobject(); $result = $someobject->{$var}->value();
这种写法和你原本的$someobject->somefunction->value()逻辑完全一致,只是把固定的方法名换成了动态变量,PHP7.2对这种语法支持得很好。
方案二:用call_user_func实现
如果你坚持要用call_user_func,可以分两步或者直接链式传递回调:
$var = 'somefunction'; $someobject = getobject(); // 分步调用,更清晰 $middleObj = call_user_func([$someobject, $var]); $result = $middleObj->value(); // 一次性链式调用 $result = call_user_func([$someobject->{$var}, 'value']);
这里要注意,call_user_func调用对象方法时,第一个参数必须是[对象实例, 方法名]这样的数组格式,所以我们先通过$someobject->{$var}拿到中间的对象,再把它和value方法组成数组传给call_user_func。
为什么你之前的写法不生效?
你尝试的字符串拼接写法'$someobject->' . $var '->value'()本质是把调用逻辑当成了字符串,PHP不会自动把这个字符串转换成实际的对象方法调用,自然会报错。正确的做法是让PHP直接识别变量对应的方法名,而不是拼接字符串。
你的PHP7.2版本完全支持上面两种方案,放心用就好~
内容的提问来源于stack exchange,提问作者Free Radical
相关产品推荐
相关产品推荐

