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
相关产品推荐
相关产品推荐

