最常用且安全的方式是类型强制转换((array))或JSON编解码;(array)会转换所有属性但私有/受保护属性带前缀,get_object_vars()仅返回public属性,JSON方式自动过滤不可序列化内容并忽略非public属性,复杂场景推荐自定义递归方法或实现JsonSerializable接口。

PHP 7.2 中将对象转为数组,最常用且安全的方式是使用 类型强制转换((array))或借助 JSON 编解码。但要注意:不同方式对私有/受保护属性、魔术方法、循环引用等处理效果不同,需按实际需求选择。
方式一:直接强制转换 (array)$obj
这是最简洁的方法,适用于标准对象(public 属性),会把对象所有 public 属性转为关联数组键值对。注意:private 和 protected 属性会被加上类名前缀(含不可见字符),可能影响后续使用。
class User {
public $name = '张三';
protected $age = 25;
private $email = 'zhang@example.com';
}
$obj = new User();
$arr = (array) $obj;
print_r($arr);
// 输出:
// Array (
// [name] => 张三
// ["\0*\0age"] => 25
// ["\0User\0email"] => zhang@example.com
// )
若只需 public 属性,可配合 get_object_vars() —— 它**只返回 public 属性**,更干净:
$arr = get_object_vars($obj); // 只含 ['name' => '张三']
方式二:用 JSON 编解码(适合简单数据结构)
先 json_encode() 再 json_decode(..., true),能自动过滤掉非标量/不可序列化内容(如资源、闭包),并统一转为纯关联数组,且 private/protected 属性默认不参与序列化(除非定义了 JsonSerializable 接口)。
$obj = new User(); $arr = json_decode(json_encode($obj), true); // 输出:['name' => '张三'] —— age 和 email 不出现(未实现 JsonSerializable)
⚠️ 注意:该方法要求对象属性可被 JSON 序列化(不能含资源、Closure、循环引用等),否则会失败或静默丢弃。
方式三:自定义转换方法(推荐用于复杂或可控场景)
当需要精确控制哪些属性导出、是否包含 protected/private、是否调用 getter 或处理嵌套对象时,建议写一个通用转换方法:
function objectToArray($obj) {
if (!is_object($obj) && !is_array($obj)) {
return $obj;
}
if (is_object($obj)) {
$obj = (array) $obj;
}
return array_map('objectToArray', $obj);
}
// 使用示例(支持多层嵌套)
class Profile {
public $user;
public $tags = ['php', 'web'];
public function __construct() {
$this->user = new User();
}
}
$profile = new Profile();
$arr = objectToArray($profile);
// 得到完整递归数组,public 属性逐层展开
补充说明:Laravel 等框架的 toArray() 方法
如果你在 Laravel 项目中,Eloquent 模型自带 toArray() 方法,它已封装好属性可见性、隐藏字段、日期格式化等逻辑:
$user = App\User::find(1); $arr = $user->toArray(); // 自动排除 $hidden 定义的字段,转换 Carbon 实例等
普通类想复用类似能力,可手动实现 JsonSerializable 接口:
class User implements JsonSerializable {
public $name = '李四';
private $token;
public function __construct() {
$this->token = 'abc123';
}
public function jsonSerialize() {
return [
'name' => $this->name,
// 不暴露 token
];
}
}
$obj = new User();
echo json_encode($obj); // {"name":"李四"}
不复杂但容易忽略:选哪种方式,关键看你的对象结构和数据敏感性。日常调试用 (array) 或 get_object_vars();API 输出优先走 json_encode + decode 或实现 JsonSerializable;业务模型建议封装专属 toArray() 方法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











