为什么Codeigniter4自定义配置静态变量在继承控制器中为空
问题成因
- 子类未正确调用父类初始化方法:CodeIgniter 4 的控制器初始化逻辑默认写在
initController()方法中,若AdminController自定义了该方法但没有优先执行parent::initController($request, $response, $logger),父类中调用load_values()填充静态变量的逻辑根本不会运行,自然读取不到值。 - 子类配置赋值时序错误:就算父类初始化逻辑正常执行,你在
AdminController中重新执行$this->config = config('My_config')的时机如果早于父类的load_values()调用,也会出现读取时静态变量还未被赋值的问题。 - 加载方法逻辑错误:如果
load_values()方法内部实际是给实例属性赋值而非静态属性赋值,即使你用静态调用语法也会出现跨实例读取为空的问题,不过该问题概率较低。
解决方法
方案1:修正控制器初始化顺序
检查AdminController的initController()方法,确保优先调用父类初始化逻辑,且不需要重复给配置属性赋值:
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger) { // 优先执行父类初始化,完成配置加载 parent::initController($request, $response, $logger); // 直接复用父类已初始化的配置属性,不需要重新赋值 echo $this->config::$users_array[0]; // 正常输出 }
方案2:配置类自动完成加载
将静态变量加载逻辑移入配置类的构造方法,只要配置类被实例化就自动完成赋值,无需在控制器手动调用:
// 在My_config.php配置类中添加构造方法 public function __construct() { parent::__construct(); // 自动加载静态变量 self::load_values(); }
调整后所有位置调用config('My_config')都可以直接读取静态变量,无需额外调用加载方法。
方案3:移除子类重复配置赋值
如果不需要重新实例化配置类,直接删除AdminController中$this->config = config('My_config')这行代码,直接复用父类已经初始化完成的配置属性即可。
内容的提问来源于stack exchange,提问作者Crunch
相关产品推荐
相关产品推荐

