PHP 7.4如何检测类型属性是否已初始化(含赋值为null的情况)
你可以使用PHP反射类ReflectionProperty的isInitialized()方法实现需求,该方法能够准确区分类型化属性「未初始化」和「已赋值(包括赋值为null)」两种状态,完全符合你的使用场景,PHP 7.4及以上版本均支持该特性。
实现代码如下:
class A { private ?string $typed; public function isTypedInitialized(): bool { return (new \ReflectionProperty(self::class, 'typed'))->isInitialized($this); } }
效果验证
- 未对
$typed做任何赋值操作时,方法返回false - 对
$typed赋值为字符串,或是显式赋值为null时,方法返回true
isset()不符合需求的原因也和你提到的一致:它会将属性值为null的情况判定为未设置,无法区分「值本身就是null」和「完全没有初始化」两种状态。
如果你的运行环境为PHP 8.0及以上,也可以用array_key_exists的方案实现,性能比反射略高:
public function isTypedInitialized(): bool { // 私有属性转数组时键名会自动加上`\0类名\0`前缀,符合PHP内部约定格式 return array_key_exists("\0" . self::class . "\0typed", (array)$this); }
内容的提问来源于stack exchange,提问作者Audiophile
相关产品推荐
相关产品推荐

