可行,PHP 8.1 通过 ReflectionProperty 的 setAccessible(true) 可读取私有属性并转为数组,需遍历反射属性、筛选私有项、设访问权限后 getValue(),不可用 (array)$obj 或 get_object_vars()。

可行,但需要明确步骤和限制条件。PHP 8.1 的反射机制完全支持读取私有属性并将其转为数组,关键在于正确使用 ReflectionProperty 和 setAccessible(true),不能依赖简单的类型转换。
必须调用 setAccessible(true) 才能读取值
私有(private)和受保护(protected)属性无法直接通过 getValue() 获取,否则会抛出 ReflectionException。必须显式开启访问权限:
- 对每个目标
ReflectionProperty实例调用$prop->setAccessible(true) - 该操作只影响当前反射对象,不改变类的实际访问控制规则
- 即使属性是
readonly,只要可访问,getValue()仍可正常读取(仅禁止写入)
获取所有属性(含私有)并构建数组
不能用 (array)$obj 或 get_object_vars(),它们只返回 public 属性。正确做法是:
- 用
new ReflectionClass($obj)创建反射器 - 调用
getProperties()获取全部属性(默认包含继承的) - 遍历每个
ReflectionProperty,用isPrivate()或getModifiers() & ReflectionProperty::IS_PRIVATE筛选 - 对每个私有属性,先
setAccessible(true),再getValue($obj)取值 - 将属性名作为键、值作为元素,组装成关联数组
注意声明位置与作用域
若只需当前类定义的私有属性(排除父类),需额外校验:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
$prop->getDeclaringClass()->getName() === get_class($obj)- 或改用
getProperties(ReflectionProperty::IS_PRIVATE)配合上述判断
另外,类必须已加载、命名空间完整,否则 ReflectionClass 构造失败。
可结合 Attributes 做元数据增强
PHP 8.1 支持在私有属性上标注 #[Attribute],读取时可一并提取:
-
$prop->getAttributes()返回ReflectionAttribute数组 -
$prop->getAttributes(Column::class)[0]->newInstance()实例化注解 - 常用于 ORM 映射(如字段名、是否主键)或序列化策略
这种组合让“私有属性 → 数组”不仅包含原始值,还能携带结构化元信息。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










