PHP 5.4无内置对象转数组函数,常用方法有:(array)强制转换(仅公有属性)、get_object_vars()(仅当前作用域公有属性)、ReflectionClass手动遍历(支持所有可见性属性并递归)、json_decode(json_encode())中间法(有数据丢失风险)。

PHP 5.4 中没有内置的“对象转数组”函数,但可通过多种方式实现对象到数组的转换。关键在于理解对象类型(标准对象、自定义类、是否含私有/受保护属性)以及所需转换深度(浅层 or 深层递归)。下面介绍几种常用且兼容 PHP 5.4 的方法。
使用 (array) 强制类型转换(仅限公有属性)
对 stdClass 对象或具有公有属性的类实例,可直接用 (array) 转换。该方式简单快捷,但会丢失私有(private)和受保护(protected)属性,且受保护属性名前会附加类名(如 "\0ClassName\0property"),导致键名不可读。
示例:
$obj = new stdClass(); $obj->name = 'Alice'; $obj->age = 28; $arr = (array) $obj; print_r($arr); // 输出:Array ( [name] => Alice [age] => 28 )
使用 get_object_vars()(仅返回公有属性)
get_object_vars() 是最常用、语义最清晰的方式,它只返回对象的**可访问公有属性**(即当前作用域下可见的 public 成员),不包含私有/受保护属性,也不处理继承关系中的父类公有属性(除非子类未重写且在子类作用域中可访问)。
适用场景:快速获取对象当前公有状态,无需关心封装细节。
- 对 stdClass、SimpleXML 对象等效果良好
- 对自定义类,需确保属性为 public,否则返回空数组
- 不递归处理嵌套对象,仅一层扁平转换
手动遍历 + ReflectionClass(支持所有属性)
若需导出 private/protected 属性(例如调试、序列化前预处理),可用 ReflectionClass。PHP 5.4 完全支持,能安全获取所有属性并设为可访问。
示例代码:
function objectToArray($obj) {
if (!is_object($obj) && !is_array($obj)) {
return $obj;
}
if (is_object($obj)) {
$obj = (array) $obj;
}
$result = array();
foreach ($obj as $key => $value) {
// 处理 protected/private 键名(如 \0*\0key)
if (preg_match('/^\x00.+\x00(.+)$/', $key, $matches)) {
$key = $matches[1];
}
$result[$key] = objectToArray($value);
}
return $result;
}
该函数递归处理,自动清理反射产生的隐藏字符,兼容各类属性可见性,适合通用转换需求。
注意 JSON 中间法(有局限性)
有人用 json_decode(json_encode($obj), true) 实现转换,但它依赖 JSON 扩展,且会丢失以下信息:
- 资源类型(resource)和资源句柄
- 不可 JSON 序列化的对象(如含循环引用、Closure)
- 数字字符串键可能被转为整型键
- DateTime 等对象会被转成字符串格式,非原始结构
仅建议用于简单数据对象(DTO)、无复杂类型且无需精确还原的场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











