PHP 5.5中对象转数组无统一接口,推荐三种安全方式:仅public属性用get_object_vars();含protected/private需ReflectionClass;json_encode+json_decode可扁平嵌套但须规避不可序列化类型。

PHP 5.5 中对象转数组没有原生的统一接口,但有几种稳定、可落地的写法。关键不是“哪种最炫”,而是“哪种在 5.5 环境下不报错、不丢数据、不触发 Notice、且能覆盖你实际用到的属性可见性”。下面按常用场景分层说明。
只取 public 属性:用 get_object_vars() 最稳妥
这是 PHP 5.5 官方文档明确支持、零兼容性风险的方式。它不依赖魔术方法,不触碰 private/protected,也不要求对象可序列化。
- 直接调用 get_object_vars($obj),返回纯关联数组,键即 public 属性名
- 若对象是 stdClass 或自定义类,只要属性声明为 public,就能拿到
- 注意:如果对象无 public 属性(比如全是 private),会返回空数组,不是 false 或 null
- 不执行 __get(),不代理访问,只读内存中真实存在的 public 成员
需要包含 protected/private 属性:必须用 ReflectionClass
PHP 5.5 已完整支持 ReflectionClass 和 setAccessible(),这是唯一能安全读取非 public 属性的标准方式。
- 创建反射器:$ref = new ReflectionClass($obj)
- 获取全部属性:$props = $ref->getProperties()
- 遍历每个 $prop,先调 $prop->setAccessible(true),再用 $prop->getValue($obj) 取值
- 手动拼数组时注意键名格式:protected 属性键为 \0*\0prop,private 为 \0ClassName\0prop;如需清洗,可用正则去掉 \0 字符
想快速扁平嵌套结构?json_encode + json_decode 是可行的
PHP 5.5 的 json 扩展已稳定,该组合在多数业务对象上可用,但必须提前验伤。
- 写法:$arr = json_decode(json_encode($obj), true)
- 优点:自动递归展开子对象、处理数组、忽略方法和资源(不会崩溃)
- 踩坑点:DateTime、Closure、resource、循环引用 会导致 json_encode 返回 false,整个链路中断
- 建议加保护:if (!$json = json_encode($obj)) { throw new InvalidArgumentException('Object contains unserializable data'); }
避免踩坑的硬核提醒
- (array) 强制转换在 PHP 5.5 可用,但慎用:它对 private/protected 属性生成不可读键名(含 \0),且在某些扩展类或重载了 __toString 的对象上行为异常
- 别依赖 __toArray() 或 ArrayAccess:PHP 5.5 不内置这些约定,自定义方法得自己写,不能当通用方案
- stdClass 对象用 get_object_vars() 和 (array) 效果一致;但自定义类若定义了 __get/__set,get_object_vars() 仍只返回真实 public 属性,不走魔术逻辑
- 反射虽强,但性能比 get_object_vars() 低 3–5 倍,高频调用场景建议缓存 ReflectionClass 实例
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











