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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:23:16