get_object_vars 返回空数组,因为 ArrayObject 的数据存储在 C 层内部哈希表中,不暴露为 public 属性,而该函数仅返回对象的可访问(public)属性。

get_object_vars 在 PHP 7.4 中对 ArrayObject 返回空数组,是因为它只获取对象的**可访问(public)属性**,而 ArrayObject 的数据实际存储在内部结构中,并不以 public 属性形式暴露。
为什么 get_object_vars 返回空?
ArrayObject 是一个内置封装类,其键值对数据并不存为 public 成员变量(如 $obj->key),而是通过 C 层内部哈希表管理。调用 get_object_vars($arrayObj) 时,PHP 只检查对象的 public 属性列表 —— ArrayObject 没有显式定义任何 public 属性,因此返回空数组 []。
正确获取 ArrayObject 的键值对
应使用 ArrayObject 自身提供的接口,而非依赖反射类属性:
-
转为普通数组:调用
$arrayObj->getArrayCopy()—— 这是最常用、最安全的方式,返回一个索引/关联数组副本。 -
遍历访问:直接用
foreach ($arrayObj as $k => $v),ArrayObject 实现了Traversable,支持原生遍历。 -
检查是否存在键:用
isset($arrayObj[$key])或array_key_exists($key, $arrayObj->getArrayCopy())。
兼容旧代码的临时适配(不推荐长期使用)
如果原有逻辑强依赖 get_object_vars 行为(例如统一处理多种对象),可加类型判断做降级处理:
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
function safe_get_object_vars($obj) {
if ($obj instanceof ArrayObject) {
return $obj->getArrayCopy();
}
return get_object_vars($obj);
}
注意:该方式仅适用于你明确知道输入可能是 ArrayObject 的场景,不能泛化用于所有对象 —— 其他 SPL 对象(如 SplFixedArray)也不适用此规则。
避免混淆:ArrayObject ≠ 普通对象
ArrayObject 设计目标是“像数组一样操作的对象”,不是“带数组语义的普通对象”。它不提供 public 属性映射,也不支持 json_encode 直接输出键值(需先 getArrayCopy())。若需要类似 stdClass 的行为,应直接用 (object) $array 或新建标准类实例。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










