PHP 8.2 新增反射功能包括:ReflectionEnum 支持枚举值获取、ReflectionNamedType::allowsNull() 判断联合类型是否允许 null、以及对只读类/属性的 isReadOnly() 等增强支持,需 PHP 8.2.x 环境及 zend.assertions=1 配置。

PHP 8.2 新增的反射笔记功能主要体现在 ReflectionEnum、ReflectionNamedType::allowsNull() 增强、以及对只读类/属性/常量的反射支持上,需结合实际代码结构逐项验证才能准确总结。
确认当前 PHP 版本并启用严格反射模式
在终端执行 php -v,确保输出包含 PHP 8.2.x(低于 8.2.0 的任何版本都不支持新反射特性)。
编辑 php.ini,将 zend.assertions 设为 1,否则 ReflectionClass::getAttributes() 在某些上下文中可能跳过只读属性元信息。
提取枚举类的底层值与用例映射
方法一:使用 ReflectionEnum 获取所有 case 的原始值和名称
立即学习“PHP免费学习笔记(深入)”;
新建一个 Status.php 文件,定义 enum Status: string;然后实例化 $ref = new ReflectionEnum(Status::class);调用 $ref->getCases() 返回 ReflectionEnumUnitCase[] 数组。
方法二:遍历每个 case 并获取其 value 属性
对每个 $case 调用 $case->getValue() → 得到声明时的标量值(如 'active'),注意:不能对 ReflectionEnumBackedCase 对象直接访问 ->name,必须用 ->getName()。
检查只读类中属性的反射可读性
第一步:定义一个只读类 readonly class User { public function __construct(public readonly string $name) {} }
第二步:用 $r = new ReflectionClass(User::class) 获取反射对象
第三步:调用 $r->getProperties(ReflectionProperty::IS_PUBLIC) → 返回的 ReflectionProperty 实例中,$prop->isReadOnly() 将返回 true;而 $prop->hasType() 在 PHP 8.2 中会正确识别构造函数参数提升的类型声明。
这一步不能省略构造函数参数提升写法,否则 isReadOnly() 可能返回 false 即使属性本身是只读的。
验证联合类型中 null 允许性的反射行为
写一个方法 function foo(): string|null { },用 $f = new ReflectionFunction('foo') 获取反射对象。
调用 $f->getReturnType() 得到 ReflectionUnionType 实例;再对其内部每个 ReflectionNamedType 调用 allowsNull() —— 此方法在 PHP 8.2 中才正式可用,8.1 及更早版本会报致命错误。
若返回 true,说明该命名类型明确允许 null;若为 false,则需进一步判断是否属于联合类型中的某个分支。这个判断逻辑不能靠 getType()->getName() === 'null' 硬匹配,必须依赖 allowsNull()。



















