PHP遍历对象未获自定义属性,如何正确获取目标键值对?
看起来你遇到的是ORM模型(比如Laravel Eloquent)的遍历问题——那些incrementing、exists、wasRecentlyCreated都是框架模型的内置公共属性,而你自定义的id、title、content其实被存在模型的保护属性里,直接用foreach遍历对象会优先拿到公共的内置属性,所以才会得到不符合预期的结果。
下面给你几种靠谱的解决方案:
方案1:使用模型自带的toArray()方法(推荐,适用于Eloquent模型)
如果你的$obj是Laravel Eloquent这类ORM模型,直接调用toArray()就能把模型的自定义字段转换成数组,然后遍历数组即可:
foreach ($obj->toArray() as $key => $value) { echo "$key = $value\n"; }
这个方法会自动过滤掉框架的内置属性,只返回你数据库里定义的字段(也就是你要的id、title、content)。
方案2:使用getAttributes()方法(适用于Eloquent模型)
Eloquent模型提供了getAttributes()方法,专门用来获取模型存储的自定义属性数组:
foreach ($obj->getAttributes() as $key => $value) { echo "$key = $value\n"; }
这个方法和toArray()类似,但返回的是原始的属性值(不会自动转换关联模型或日期字段),适合需要原始数据的场景。
方案3:使用get_object_vars()函数(适用于普通自定义对象)
如果你的对象是自己定义的普通类,且属性是私有/保护的,可以用PHP内置的get_object_vars()函数,它会返回当前作用域下可访问的对象属性:
$customProperties = get_object_vars($obj); foreach ($customProperties as $key => $value) { echo "$key = $value\n"; }
注意:如果属性是私有/保护的,只有在类内部调用这个函数才能拿到,外部调用只能拿到公共属性。
为什么原来的foreach不行?
PHP的foreach遍历对象时,默认只会遍历对象的公共非静态属性。而像Eloquent这类ORM模型,会把你的自定义字段存在$attributes这个保护属性里,不会直接暴露为公共属性,所以你遍历对象时拿到的都是框架自带的公共属性,而不是你要的自定义字段。
内容的提问来源于stack exchange,提问作者Yassin

