为什么在PHP的Trait中访问实例属性$currentConfig会报未初始化错误?
问题原因
你遇到的报错本质是PHP类型属性的初始化规则限制,和Trait、实例访问本身没有关系:
- 从PHP 7.4开始,带类型声明的属性如果没有设置默认值,会默认处于**未初始化(uninitialized)**状态,哪怕是可空类型
?array也不会自动填充null作为默认值。你代码里的private ?array $currentConfig;只做了类型声明,没有赋值默认值,所以实例创建完成后该属性仍然是未初始化状态。 var_dump可以直接输出属性的未初始化状态,但你直接读取属性值(self::$instance->currentConfig)时,PHP会强制校验属性状态,未初始化的属性就会抛出must not be accessed before initialization错误。
修复方案
最简单的修复方式是给属性增加默认值:
trait GetCurrentConfigTrait { private static ?object $instance; // 新增默认值null private ?array $currentConfig = null; final public static function getCurrentConfig($name) { $class = __CLASS__; self::$instance = self::$instance ?? new $class(); if(is_array(self::$instance->currentConfig)){ return self::$instance->currentConfig; } else{ // 这里正常加载配置后给currentConfig赋值即可 self::$instance->currentConfig = ['你的配置项']; return self::$instance->currentConfig; } } }
如果你不想在Trait里设置默认值,也可以在使用该Trait的类的构造函数中手动初始化$currentConfig属性。
内容的提问来源于stack exchange,提问作者Orry
相关产品推荐
相关产品推荐

