PHP 7.4 中将多维嵌套对象完整转为数组,需穿透所有层级、访问所有可见性属性并递归处理;推荐方案包括:json_encode+json_decode(true)快速兜底、ReflectionClass手写递归函数精确控制、或在类中定义toArray()方法内聚实现。

PHP 7.4 中将多维嵌套对象完整转为数组,关键在于**穿透所有层级、访问所有可见性属性(包括 private/protected)、并递归处理子对象或子数组**。单纯用 (array) 或 get_object_vars() 都会丢失深层结构或非公有成员。以下是几种可靠且兼容 PHP 7.4 的方案:
用 json_encode + json_decode(true) 快速兜底
适合大多数标准数据对象(无资源、闭包、不可序列化对象):
- 调用
$array = json_decode(json_encode($obj), true); - 自动展开所有嵌套对象和数组,结果是纯关联数组
- 能间接“看到”私有/受保护属性(前提是它们可被
json_encode序列化) - ⚠️ 注意:
DateTime、Resource、Closure、mysqli等会变成null或报错;含循环引用会失败
手写递归函数 + ReflectionClass 精确控制
适用于需保留全部属性(含 private/protected)、自定义转换逻辑、或处理特殊类型(如 DateTime)的场景:
- 使用
ReflectionClass获取所有属性,调用setAccessible(true)强制读取 - 对每个属性值判断类型:是对象就递归调用自身;是数组就遍历并递归;是标量或
DateTime就格式化(如$val->format('c')) - 示例核心逻辑:
function objectToArray($obj) { if (!is_object($obj) && !is_array($obj)) return $obj; if (is_object($obj)) { $ref = new ReflectionClass($obj); $props = $ref->getProperties(); $arr = []; foreach ($props as $prop) { $prop->setAccessible(true); $key = $prop->getName(); $val = $prop->getValue($obj); $arr[$key] = objectToArray($val); } return $arr; } if (is_array($obj)) { return array_map(__FUNCTION__, $obj); } }
在类中定义 toArray() 方法(推荐长期维护项目)
把转换逻辑内聚到业务对象中,更可控、可测试、易扩展:
立即学习“PHP免费学习笔记(深入)”;
- 在基类或具体模型中添加
public function toArray() - 内部可混合使用反射、显式字段映射、类型判断和格式化(比如把
Carbon转字符串) - 支持跳过敏感字段(
password)、重命名键(user_id → id)、追加计算字段 - 若多个类共用逻辑,可提取为 trait 或抽象基类方法
不建议单独依赖的方法
这些方式在多维嵌套场景下容易出问题:
-
(array)$obj:只展一层,私有属性键名含\0*\0或\0ClassName\0,难以清理且不递归 -
get_object_vars($obj):仅返回当前作用域可访问的公有属性,忽略继承来的、私有/受保护属性,也不递归 -
array_map('objectToArray', (array)$obj):没处理属性可见性,遇到私有属性直接跳过



















