ReflectionProperty 在 PHP 7.2 中可判断属性访问类型、获取默认值、检测是否保持默认声明状态,并通过 setAccessible(true) 安全读取私有/受保护属性值。

在 PHP 7.2 中,ReflectionProperty 本身不直接提供“默认访问属性”这个概念,但你可以通过它准确判断一个属性是否为 默认声明(即未显式赋值)、是否已初始化、是否为 public/protected/private,以及它的默认值来源。关键在于区分两个常被混淆的点:默认值(default value) 和 是否为默认声明(isDefault)。
获取属性的默认值(声明时的初始值)
ReflectionClass::getDefaultProperties() 是获取类中所有具有默认值的属性(public/protected/private)最直接的方式。它返回一个关联数组,键是属性名,值是声明时赋予的默认值(未初始化的属性不会出现在该数组中)。
- 只包含在类定义中明确写死的默认值,如
public $name = 'guest'; - 不包含运行时动态赋值,也不反映当前对象实例的实时值
- private/protected 属性的默认值也能被获取(只要声明了)
判断属性是否为“默认声明”(isDefault)
ReflectionProperty::isDefault() 的作用是:检查该属性在当前对象实例中是否仍保持其类定义时的默认值(即未被运行时修改过)。注意:它不是判断“是否是 public”,而是判断“值是否还是原始默认值”。
- 若属性在类中声明为
public $bar;(无默认值),则isDefault()返回true—— 因为它尚未被赋值,仍处于“未初始化”的原始状态 - 若你执行了
$obj->bar = 42;,再调用isDefault()就返回false - 对动态添加的属性(如
$obj->baz = 123;),isDefault()恒为false,因为它们根本不在类定义中
查看属性的实际访问控制(public/protected/private)
ReflectionProperty 提供了明确的方法来识别访问修饰符:
立即学习“PHP免费学习笔记(深入)”;
-
$prop->isPublic()、$prop->isProtected()、$prop->isPrivate()—— 返回布尔值 -
$prop->getModifiers()—— 返回整型修饰符位掩码,可用ReflectionProperty::IS_PUBLIC等常量比对 - 注意:PHP 7.2 不支持
readonly(那是 PHP 8.1+ 的特性)
安全读取属性值(含 private/protected)
要读取任意访问级别的属性值(包括 private/protected),必须先调用:
-
$prop->setAccessible(true);—— 绕过访问控制(PHP 7.2 支持) - 再用
$prop->getValue($object)获取当前实例中的值 - 若属性尚未初始化(如
public $x;且未赋值),getValue()在 PHP 7.2 中会触发 Notice,建议配合isInitialized()(PHP 7.4+)或手动判空;PHP 7.2 可用isset($object->$propName)辅助判断



















