You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter中$access变量重写失效:角色权限系统开发问题

解决CodeIgniter继承控制器重写$access变量失效的问题

嘿,我之前在做CodeIgniter角色权限系统的时候也踩过一模一样的坑!你说的$access变量始终显示*的问题,大概率是变量的访问权限或者初始化顺序出了问题,咱们一步步来理清楚:

最常见的两个问题及解决方案

1. 变量的访问权限设成了private

如果你的MY_Controller里把$access声明成了private,那子类根本没法真正重写这个变量——子类里的$access其实是一个全新的变量,和父类的不是同一个,父类里打印的自然还是自己的默认值*。

修正后的MY_Controller写法:

<?php
class MY_Controller extends CI_Controller {
    // 必须用protected(推荐)或public,子类才能继承并重写
    protected $access = '*';

    public function __construct() {
        parent::__construct();
        // 别着急在构造里直接打印,先把权限检查逻辑封装成方法
        $this->validate_access();
    }

    protected function validate_access() {
        // 这里打印的就是子类重写后的$access值了
        echo $this->access;
        // 后续可以在这里加角色匹配、权限验证的逻辑
    }
}

2. 父类构造函数的执行时机问题

CodeIgniter的控制器执行顺序是先跑父类构造,再跑子类构造。如果你的MY_Controller在构造函数里直接打印$access,这时候子类还没来得及重写这个变量,自然拿到的是父类的默认值*。

正确的Page控制器写法:

<?php
class Page extends MY_Controller {
    // 用同样的protected权限重写变量
    protected $access = 'admin,editor';

    public function __construct() {
        // 一定要先调用父类构造,再写子类自己的逻辑
        parent::__construct();
    }

    public function index() {
        // 页面业务逻辑
    }
}

额外需要排查的细节

  • 文件名是否正确:MY_Controller.php必须放在application/core/目录下,且文件名大小写要和类名一致(CodeIgniter对大小写敏感)
  • 父类构造里有没有重新赋值:如果MY_Controller的构造函数里写了$this->access = '*';,那就算子类重写了,也会被父类的赋值覆盖掉,要把这句删掉

按照上面的方法调整后,你再试试打印$access,应该就能拿到子类重写后的值啦!

内容的提问来源于stack exchange,提问作者Nihal Saxena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:16:04