PHP对象转数组需按需选择方法:强制转换仅支持public属性且私有属性键名带前缀;get_object_vars()最安全,只返回public属性;json_encode+json_decode可递归处理嵌套但丢失类型;自定义toArray()方法最灵活可控。

PHP对象转数组不是靠一个“万能函数”就能搞定的,而是根据你的需求选对方法。关键看:要不要私有属性?有没有嵌套对象?是否要保留类型或格式?下面这几种主流方式,新手照着用不踩坑。
直接强制转换:适合简单 stdClass 或纯 public 属性
写法最短,一行搞定:$arr = (array) $obj;
它把对象的 public 属性变成数组键值对,但私有(private)和受保护(protected)属性不会“消失”,只是键名加了前缀:
- 受保护属性变成
"\0*\0property" - 私有属性变成
"\0ClassName\0property"
所以如果你只操作 public 字段,这个方法又快又干净;但如果要读私有属性,得按带前缀的键名去取,容易出错,不推荐用于复杂类。
get_object_vars():只拿 public 属性,最安全稳妥
这是 PHP 原生函数,专为提取可访问属性设计:$arr = get_object_vars($obj);
特点很明确:
- 只返回
public属性,不碰private和protected - 不触发
__get魔术方法,结果可预测 - 对
stdClass、动态添加属性的对象都有效 - 如果对象没 public 属性,就返回空数组 —— 不报错,好判断
适合 API 响应前快速导出公开字段,比如用户基本信息、配置项等。
json_encode + json_decode:能穿透嵌套,但会丢类型
两步组合:$arr = json_decode(json_encode($obj), true);
它先把对象序列化成 JSON 字符串,再解析成关联数组。优势是:
- 自动递归处理嵌套对象、多维数组
- 能“间接”拿到部分
protected属性(前提是没被jsonSerialize()过滤) - 天然过滤资源(resource)、闭包(Closure)、循环引用
但要注意代价:
-
DateTime变成字符串,int可能变string,原始类型全丢失 - 中文乱码?确认文件和输出都是 UTF-8 编码
- 含不可序列化内容(如 MySQL 连接)会静默失败或返回
null
自定义 toArray() 方法:业务项目首选
在你自己的类里加一个公共方法,完全掌控转换逻辑:
public function toArray()
{
return [
'id' => $this->id,
'name' => $this->name,
'created_at' => $this->createdAt?->format('Y-m-d H:i:s'),
'status' => match($this->status) {
1 => 'active',
2 => 'inactive',
default => 'unknown'
}
];
}
好处非常明显:
- 字段可重命名、可计算、可格式化(比如时间转字符串)
- 敏感字段(如密码、token)可主动排除
- 支持条件输出(如仅管理员可见的字段)
- 团队协作时语义清晰,维护成本低
不推荐用魔术方法 __toArray() —— 它不是 PHP 内置标准,很多 IDE 和静态分析工具不识别,容易引发兼容问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











