PHP 8.4 未内置能安全递归转换任意对象为数组的原生函数;仍依赖 (array)、get_object_vars、json_encode/json_decode、ReflectionClass 或自定义 toArray 方法,各有限制。

没有。
PHP 8.4 没有新增、也从未内置任何原生函数,能直接、安全、通用地递归将任意对象(含私有/受保护属性、嵌套对象、循环引用)转换为数组。
所有已知的 PHP 版本(包括 8.4)仍沿用以下五种主流方式,各自有明确限制:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
(array) $obj
仅转公有属性;私有/受保护属性键名带\0ClassName\0prop或\0*\0prop前缀,不递归处理子对象。get_object_vars($obj)
只返回当前作用域可访问的公有属性,完全忽略私有/受保护成员,也不递归。-
json_decode(json_encode($obj), true)
能穿透可见性限制、自动递归扁平化,但要求:- 所有属性值必须可 JSON 序列化(不能含 resource、Closure、GMP 对象等)
- 会丢失原始类信息、方法、资源句柄
-
DateTime等对象被转为字符串,不可逆 - 遇到循环引用直接失败(返回
false)
ReflectionClass手动遍历
可读取所有属性(public/protected/private),需手动调用setAccessible(true),再对每个值递归处理——但这仍是开发者编写的逻辑,非“内置函数”。类内定义
toArray()或__toArray()方法
最可控,但属于业务层约定,非语言级支持。
✅ 真正“递归 + 全属性 + 防环 + 类型保留”的能力,必须靠自定义函数实现,例如:
立即学习“PHP免费学习笔记(深入)”;
function objectToArray($obj, &$visited = []) { if (!is_object($obj) && !is_array($obj)) return $obj; if (is_object($obj)) { if (in_array($obj, $visited, true)) return null; $visited[] = $obj; $obj = (array) $obj; } $result = []; foreach ($obj as $k => $v) { $result[$k] = objectToArray($v, $visited); } return $result; }
PHP 的设计哲学是保持核心精简,这类高阶数据结构转换始终交由开发者按需实现。


















