(array)$obj最快但属性键名含不可见前缀;json_encode+json_decode兼容好但类型损失且慢一倍;ReflectionClass最灵活可控但性能最差。

强制转换 (array) 最快但属性可见性受限
在 PHP 7.4 中,(array)$obj 是性能最高的方式,实测 10000 次转换仅耗时约 12ms。它直接执行浅拷贝,把对象当前所有属性(包括 public、protected、private)都写入数组,但私有属性键名会变成 \0ClassName\0property,受保护属性是 \0*\0property。这意味着你得手动清理键名才能统一访问,而且无法递归处理嵌套对象——子对象仍保持对象形态。
适用场景:标准 stdClass 或简单 DTO,且只含 public 属性;或你接受带前缀的键并自行后处理。
json_encode + json_decode(true) 兼容性好但有类型损失
这个组合能绕过访问控制,自动递归展开嵌套对象和数组,对 protected/private 属性也有效(前提是它们可被 JSON 序列化)。PHP 7.4 默认支持 typed property,但 DateTime、resource、Closure、SimpleXML 等不可序列化类型会导致 json_encode() 返回 false。另外,所有对象都会被“扁平化”:DateTime 变成 ISO8601 字符串,枚举(PHP 8.1+)不支持,自定义类若没实现 JsonSerializable 就只能靠 public 属性撑场。
实测 10000 次耗时约 28ms,比强制转换慢一倍多,但胜在代码简洁、跨框架通用。
立即学习“PHP免费学习笔记(深入)”;
ReflectionClass 最灵活可控但开销最大
反射能精确读取任意可见性的属性,包括父类 private 成员(通过 getProperties(ReflectionProperty::IS_PRIVATE)),还能配合 setAccessible(true) 安全提取值。你可以决定是否递归转换子对象、是否过滤敏感字段、是否重命名键名(比如去掉 \0 前缀)、是否跳过 null 值等。PHP 7.4 的 typed property 不影响反射读取,但需注意:如果属性是 readonly,反射仍可 getValue,只是不能 setValue。
缺点是性能最低,10000 次约耗时 45ms,且代码量明显增加。适合需要完整结构映射、审计合规、或对接强 schema 要求的导出场景。
选哪个?看你的优先级
- 要速度 + 简单结构 → 用 (array),再加正则清理键名(
preg_replace('/^\x00.*?\x00/', '', $key)) - 要递归 + 快速落地 + 不介意字符串化时间类型 → 用 json_decode(json_encode($obj), true),加空值判断防失败
- 要 100% 属性覆盖 + 类型保留 + 自定义逻辑 → 上 ReflectionClass,封装成可复用的工具方法



















