PHP 8.1 中通过 ReflectionProperty 的 isPublic()/isProtected()/isPrivate() 或 getModifiers() 位运算精准获取属性访问控制;需调用 setAccessible(true) 才能读取 protected/private 属性值,并可结合 getAttributes() 读取属性钩子。

PHP 8.1 中读取类属性的默认访问控制(public / protected / private)不靠“猜测”,而是通过反射对象的明确方法直接获取。关键在于使用 ReflectionProperty 实例的 getModifiers(),再配合位运算判断修饰符类型。
获取属性并识别访问级别
先用 ReflectionClass 获取所有属性,遍历每个 ReflectionProperty 对象:
-
$prop->isPublic()返回布尔值,表示是否为 public -
$prop->isProtected()和$prop->isPrivate()同理,三者互斥且覆盖全部情况 - 也可用
$prop->getModifiers() & ReflectionProperty::IS_PUBLIC这类位掩码方式,适合批量筛选
注意属性是否已声明(而非继承)
默认 getProperties() 会包含父类中定义的属性。若只关心当前类显式声明的属性,需额外校验:
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 调用
$prop->getDeclaringClass()->getName() === $reflector->getName() - 或直接用
$reflector->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE)并配合上述判断
读取属性值前必须处理可访问性
即使知道是 private 属性,也不能直接 $prop->getValue($obj) —— 会抛出 ReflectionException:
立即学习“PHP免费学习笔记(深入)”;
- 对 protected/private 属性,必须先调用
$prop->setAccessible(true) - 该操作仅影响当前反射对象,不改变运行时实际访问控制
- PHP 8.1+ 仍要求类已加载、命名空间完整,否则
ReflectionClass构造失败
结合属性钩子(Attributes)一起读取
PHP 8.1 引入属性钩子后,常需同时获取访问控制与元数据:
-
$prop->getAttributes()返回所有属性钩子实例数组 -
$prop->getAttributes(Column::class)可按类名精确过滤 - 通常在确认属性可见性后,再读取其钩子用于 ORM 映射或验证逻辑


















