PHP 7为何取消数组元素作为对象方法名调用的功能?
PHP 7.x中数组元素嵌套调用对象方法报错的原因与解决方案
这个问题我迁移项目的时候也踩过坑!其实是PHP 7对复杂变量的解析规则做了严格调整,导致你原来在PHP 5.6里能跑的写法,到PHP 7.1就触发致命错误了。
问题根源:解析优先级的变化
在PHP 5.6及更早版本中,解析器处理$array['object']->$array['method']()这种嵌套表达式时,会从右往左识别——先把$array['method']解析为方法名,再调用$array['object']对应的对象方法。
但PHP 7改变了这个解析逻辑:它会优先处理$array['object']->$array,把$array当成一个方法名,试图调用Car::Array(),而你的Car类根本没有这个方法,所以直接抛出致命错误。
验证代码对比
报错写法(PHP 7.x触发错误)
class Car { public function getMilage() { return 10000; } } $carObj = new Car(); $array = ['method'=>'getMilage', 'object'=>$carObj]; // 致命错误:Uncaught Error: Call to undefined method Car::Array() $mileage = $array['object']->$array['method']();
可行写法(你已经用到的拆分赋值)
$carObj = new Car(); $array = ['method'=>'getMilage', 'object'=>$carObj]; $objName = $array['object']; $metName = $array['method']; $mileage = $objName->$metName(); // 正常返回10000
更简洁的替代方案:用花括号强制解析顺序
除了拆分变量,你还可以用花括号包裹方法名表达式,明确告诉解析器先解析$array['method']:
$mileage = $array['object']->{$array['method']}();
这种写法同时兼容PHP 5.6和PHP 7.x,也是官方推荐的更清晰的写法。
补充说明
这个变更属于PHP 7的向后不兼容特性,目的是消除变量解析的歧义,让代码的行为更可预测。
内容的提问来源于stack exchange,提问作者StasGrin
相关产品推荐
相关产品推荐

