PHP 7.0中对象转数组需据类型选策略:(array)仅适用于public属性的标准对象;get_object_vars()安全提取当前public属性;jsonSerialize()+json_decode适合深度转换;SimpleXML等须用迭代器或双转JSON。

PHP 7.0 中对象转数组失败,通常不是函数本身有问题,而是对象类型、访问权限或结构导致的隐式转换失效。直接用 (array) 强制转换看似简单,但对非标准对象(如 SimpleXML、PDOStatement 或自定义类)常常返回空数组或不完整数据。
确认对象是否支持直接强制转换
只有满足以下条件的对象,(array) 才能正常转出属性:
- 属性必须是 public,protected 和 private 属性在转换后会带不可见前缀(如
"\0*\0prop"),导致键名混乱或丢失 - 对象不能是内置扩展对象(如
SimpleXMLElement),它们重写了序列化逻辑,强制转换会返回空数组 - 类未定义
__toArray()或jsonSerialize()等魔术方法时,无法控制输出结构
用 get_object_vars() 获取 public 属性
这是最稳妥的基础方式,只提取当前作用域可见的 public 属性(不含继承来的 protected/private):
示例:$obj = new stdClass(); $obj->name = 'Alice'; $obj->age = 30; $arr = get_object_vars($obj); // ['name' => 'Alice', 'age' => 30]
注意:它不会递归处理嵌套对象,也不会触发任何魔术方法。
对自定义类实现 jsonSerialize() + json_decode()
适合需要深度转换、兼容私有/受保护属性,或统一 API 返回格式的场景:
- 在类中实现
jsonSerialize(),明确返回要导出的数组结构 - 再用
json_encode()→json_decode(..., true)完成转换
class User {
private $id = 123;
public $name = 'Bob';
public function jsonSerialize() {
return ['id' => $this->id, 'name' => $this->name];
}
}
$user = new User();
$arr = json_decode(json_encode($user), true); // ['id' => 123, 'name' => 'Bob']
处理 SimpleXML 或其他特殊对象
像 SimpleXMLElement 这类对象必须显式 cast 到 string 或用迭代器遍历:
- 获取文本内容:
(string) $xml->title - 转为普通数组:
json_decode(json_encode((array) $xml), true)(先转 array 再 JSON 双转) - 更可靠的方式是用
iterator_to_array()配合SimpleXMLIterator
避免直接 (array) $xml,否则可能得到空或乱码键名。
不复杂但容易忽略:转换前先 var_dump(get_class($obj)) 确认对象类型,再选对应策略。没有万能函数,关键看对象“是谁”、属性“是否可见”、结构“是否嵌套”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











