PHP 7.1 到 PHP 8.x 对象转数组的核心方法基本兼容,(array) 转换保留属性前缀规则,get_object_vars() 仅返回 public 属性,json_encode/json_decode 可处理嵌套但需防不可序列化类型,ReflectionClass 可安全读取所有属性。

PHP 7.1 到 PHP 8.x 对象转数组的核心方法基本兼容,但需注意几个关键变化点:PHP 8 强化了类型安全与反射行为,json_encode() 对不可序列化类型的报错更严格,而 (array) 和 get_object_vars() 的语义在两版本中保持一致。只要避开已废弃用法(如 PHP 8.2+ 移除的动态属性写入警告),以下方法在 PHP 7.1–8.4 均可稳定运行。
用 (array) 强制转换 —— 简单、快,只适合 public 属性
直接写 $arr = (array) $obj; 即可。它会把对象所有属性转成数组键值对,但:
- public 属性 → 普通键名,如
'name' - protected 属性 → 键名为
"\0*\0name" - private 属性 → 键名为
"\0ClassName\0name"
PHP 8 没改这个行为,但带前缀的键名操作麻烦,建议仅用于调试或 stdClass 等纯数据对象。
用 get_object_vars() —— 安全、干净,只取 public 可访问属性
这是最稳妥的兼容方案:$arr = get_object_vars($obj);
立即学习“PHP免费学习笔记(深入)”;
- PHP 7.1 和 PHP 8 都只返回当前作用域下可直接读取的 public 属性
- 不处理 protected/private,也不触发
__get,无副作用 - 若对象无 public 属性,返回空数组
[],不会报错
适合 API 输出、表单映射等明确只需公开字段的场景。
用 json_encode + json_decode —— 兼容嵌套,但要防不可序列化类型
一行搞定:$arr = json_decode(json_encode($obj), true);
- PHP 7.1 和 8.x 都支持,能穿透 protected/private 属性(因 JSON 编码会自动访问)
- 自动递归处理嵌套对象和数组
- ⚠️ 注意:PHP 8 对资源(resource)、闭包(Closure)、循环引用更敏感,
json_encode()会直接返回false,需提前判断:
用 ReflectionClass 读取全部属性 —— 灵活可控,兼容性好
适用于必须导出 private/protected 字段的场景,代码在 PHP 7.1–8.4 完全可用:
- 实例化
$ref = new ReflectionClass($obj); - 调用
$props = $ref->getProperties(); - 遍历每个
$prop,执行$prop->setAccessible(true);后读值 - PHP 8 没废弃
setAccessible(),且性能比 PHP 7 更稳
建议封装为通用函数,并对 DateTime、stdClass 等常见类型做格式预处理(如 format('c')),避免后期踩坑。



















