PHP 5.x与7.x差异:使用变量访问对象属性的行为不同
PHP 5.x vs 7.x: 解析
$this->my_row->$field['name']的差异 这个问题本质是PHP版本对变量属性与数组索引的解析优先级做了调整,咱们结合你的具体场景一步步拆解:
在PHP 5.x中的执行行为
PHP 5.x会优先处理对象的属性访问操作,再处理数组索引。也就是说,你写的$this->my_row->$field['name']会被PHP解析成:
// 先尝试访问$this->my_row的$field变量对应的属性 $temp = $this->my_row->$field; // 再从这个结果里取['name']索引 $value = $temp['name'];
但这里的$field是一个数组,PHP会把它转成字符串"Array",所以实际是在找$this->my_row->Array这个属性——而你的$this->my_row里根本没有这个属性,所以$temp会是null。接下来对null执行数组索引操作,会触发E_NOTICE级别的错误(比如Trying to access array offset on value of type null),最终$value的值是null,完全不符合你的预期。
在PHP 7.x中的执行行为
PHP 7.x调整了这个解析顺序,会先处理数组索引,再去访问对象属性。你的代码会被解析成:
// 先获取$field['name']的值,也就是'exam' $prop_name = $field['name']; // 再访问$this->my_row对应的属性 $value = $this->my_row->$prop_name;
这正好匹配你的场景:$prop_name是'exam',所以$this->my_row->exam会返回'bio',完全符合预期,也不会有任何错误。
小技巧:兼容两个版本的写法
如果你需要代码在PHP5和PHP7中都能正确运行,只需要手动加括号明确优先级就行:
$value = $this->my_row->($field['name']);
这样不管哪个版本,都会先解析$field['name'],再去访问对应的对象属性。
内容的提问来源于stack exchange,提问作者HappyMe
相关产品推荐
相关产品推荐

