ArrayHelper::toArray() 与 get_object_vars() 功能定位不同:前者是深度结构化转换工具,支持嵌套、getter、字段映射与动态计算;后者仅返回对象的 public 属性,不递归、不支持方法调用或数组输入。

ArrayHelper::toArray() 和 PHP 原生 get_object_vars() 表面都“把对象转成数组”,但目标、能力、适用场景完全不同——不是替代关系,而是分工明确的工具。
作用范围不同
-
get_object_vars()只能获取当前对象的 public 属性值,且不递归、不处理嵌套、不支持对象数组、不识别 getter 方法或虚拟属性。 -
ArrayHelper::toArray()是深度结构化转换工具:支持对象、对象数组、多层嵌套对象、ActiveRecord 实例,还能按需提取指定字段、重命名键、执行回调计算、跳过 null 值等。
处理 ActiveRecord 或带 getter 的对象时表现差异明显
比如一个 Post 模型有 id、title、content 属性,还定义了 getLength() 和 getCreatedAt():
$post = new Post(['id' => 1, 'title' => 'Hello', 'content' => '...']);
-
get_object_vars($post)返回:['id' => 1, 'title' => 'Hello', 'content' => '...']
✅ 仅 public 成员变量;❌ 不含
length、createdAt(它们是方法返回值)。 -
ArrayHelper::toArray($post, ['id', 'title', 'length', 'createdAt'])可正确调用 getter 并映射:[ 'id' => 1, 'title' => 'Hello', 'length' => 301, // 来自 getLength() 'createdAt' => '2023-01-01 12:00:00' // 来自 getCreatedAt() ]
支持灵活字段映射与动态计算
ArrayHelper::toArray() 允许用字符串点语法(如 'profile.name')、匿名函数、甚至字段别名:
$properties = [
'app\models\Post' => [
'id',
'title',
'createTime' => 'created_at', // 字段重命名
'length' => function ($post) {
return strlen($post->content);
}
]
];
$result = ArrayHelper::toArray($post, $properties);get_object_vars() 完全不支持这类逻辑。
对数组输入和递归行为也不同
-
get_object_vars()接收非对象会直接返回false或空数组,不兼容数组输入。 -
ArrayHelper::toArray()可安全处理:- 普通数组 → 原样返回
- 对象数组 → 逐个转为数组并合并
-
recursive = true(默认)→ 自动展开嵌套对象/数组
例如:
$posts = [new Post(), new Post()]; ArrayHelper::toArray($posts); // 得到二维数组,每个元素都是 post 的属性数组
而 get_object_vars($posts) 会失败(因为 $posts 是数组,不是对象)。
性能与用途定位
-
get_object_vars()是底层 PHP 函数,极快,适合简单调试或只读 public 属性的轻量场景。 -
ArrayHelper::toArray()是框架级工具,封装了类型判断、递归、getter 调用、回调执行等逻辑,开销略高,但专为 Web 应用数据输出(如 API 返回、表单预填、日志记录)设计。
不复杂但容易忽略。


















