最常用方法是(array)强制转换,但仅浅转换且对私有属性、嵌套对象有局限;推荐优先使用get_object_vars()获取公有属性,复杂场景用json_decode(json_encode($obj), true)或自定义toArray()方法。

PHP里把对象转成关联数组,最常用也最直接的方法是用 (array) 强制类型转换,但要注意它只做浅转换,且对私有/受保护属性、对象嵌套等有局限。下面分几种典型场景讲清楚怎么操作、有什么坑、怎么绕过去。
用 (array) 快速转简单对象
适用于公有属性的 stdClass 或自定义类(无魔术方法干扰):
- 直接写
(array)$obj,PHP 会把对象的公有属性名作为键,值保持不变 - 例如:$user = new stdClass(); $user->name = '张三'; $user->age = 25; $arr = (array)$user; → $arr 就是 ['name' => '张三', 'age' => 25]
- 注意:私有属性会变成 "\0ClassName\0prop" 这种格式的键,看着难读,实际也能用,但不推荐依赖
用 get_object_vars() 获取公有属性
比强制转换更明确,只返回公有属性,不带奇怪前缀:
-
get_object_vars($obj)返回一个关联数组,键是属性名,值是当前值 - 它不会处理私有或受保护属性,也不会触发 __get(),适合“干净取值”场景
- 如果对象是 stdClass 或属性全为 public,结果和
(array)基本一致,但语义更清晰
处理含私有属性、__get() 或嵌套对象的情况
当对象用了封装、魔术方法或内部还有对象时,上面两种方法就不够了:
立即学习“PHP免费学习笔记(深入)”;
- 先尝试调用对象的
toArray()或jsonSerialize()方法(如果类自己实现了) - 没有的话,可手动遍历
get_class_vars()+get_object_vars(),再用反射(ReflectionClass)读取所有属性(包括 private/protected) - 更轻量的替代:用
json_decode(json_encode($obj), true)—— 把对象先转 JSON 再转数组,能自动扁平化嵌套对象,忽略不可序列化的资源,但会丢失类型(比如 int 变成 string)、丢掉空数组/对象、不支持闭包和资源
自定义类建议加个 toArray() 方法
长期维护或多人协作时,别总靠外部转换:
- 在类里写一个
public function toArray(),明确控制哪些字段暴露、怎么格式化(比如时间转字符串、隐藏密码字段) - 可以结合
array_filter()、isset()或属性白名单,避免意外泄露数据 - 这样既安全又易读,调试和 API 输出都更可控



















