You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:28:50