最简方式是(array)强制转换,仅保留public属性;get_object_vars()语义明确但同样受限于访问控制;ReflectionClass可读取所有属性;json_encode/json_decode是通用兜底方案。

直接用 (array) 强制转换只保留 public 属性
这是最简方式,但仅导出对象的 public 成员变量,private 和 protected 属性会被忽略,甚至可能变成不可见的特殊键名(如 "\0ClassName\0property"),实际开发中容易引发数据丢失。
- 适合快速调试或仅需公开字段的轻量场景
- 不适用于含私有配置、敏感状态或封装逻辑的类
- 若属性名含特殊字符或非 ASCII,转换后键名可能乱码或不可访问
get_object_vars() 只返回当前作用域可见的属性
该函数行为与 (array) 类似:在类外部调用时,只能获取 public 属性;在类内部(比如在方法里)调用,则能拿到当前对象所有可访问的属性(仍受访问控制限制)。
- 它比强制转换更语义明确,是官方推荐的“安全获取公开属性”方式
- 对 private/protected 属性无穿透能力,不是万能方案
- 返回结果为关联数组,键为属性名,值为对应当前值(不递归处理嵌套对象)
用 ReflectionClass 暴露全部属性(含 private/protected)
反射是唯一能系统性读取私有和受保护属性的标准手段。关键步骤包括:获取所有属性 → 设置可访问 → 读取值。
- 需实例化 ReflectionClass,调用 getProperties()
- 遍历每个 ReflectionProperty,执行 setAccessible(true)
- 再用 getValue($obj) 安全读取原始值
- 注意:PHP 8.1+ 中,readonly 属性也可被反射读取,但不能被修改
json_encode + json_decode(TRUE) 是通用兜底方案
先序列化为 JSON 字符串,再反解为关联数组。这个组合能穿透所有属性(包括 private/protected),前提是属性值可被 JSON 编码(即不含资源、闭包、循环引用等)。
- 自动跳过不可序列化的属性(如 resource、Closure),不报错但会静默丢弃
- 日期对象、DateTimeImmutable 会被转成字符串格式(如 "2026-10-27T10:09:00+08:00")
- 枚举(Enum)在 PHP 8.1+ 中默认转为值(如 UserType::Admin->value === 2),而非名称
- 性能略低于反射,但代码简洁,适合 API 响应、日志快照等场景
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











