如何在CodeIgniter 3中防止变量被覆盖?
保护CodeIgniter3核心用户ID变量不被覆盖的解决方案
方案1:私有/受保护变量 + 只读Getter方法(最兼容)
将$_idUtente改为私有(或受保护)变量,仅通过一个不可重写的Getter方法对外提供读取能力,从根源上阻止直接修改。
代码示例:
class MY_Controller extends CI_Controller { // 设为私有,子类也无法直接访问 private $_idUtente; public function __construct() { parent::__construct(); // 从ion_auth会话中初始化用户ID $user = $this->ion_auth->user()->row(); $this->_idUtente = $user->id; } // final关键字确保子类无法重写该方法 final public function getIdUtente() { return $this->_idUtente; } }
第三方开发者只能通过$this->getIdUtente()获取用户ID,无法直接修改$_idUtente,彻底避免篡改风险。
方案2:利用魔术方法__set阻止赋值
如果需要保留变量风格的访问(不强制用Getter),可以结合受保护变量和__set魔术方法,拦截对$_idUtente的赋值操作:
class MY_Controller extends CI_Controller { protected $_idUtente; public function __construct() { parent::__construct(); $user = $this->ion_auth->user()->row(); $this->_idUtente = $user->id; } public function __set($name, $value) { if ($name === '_idUtente') { // 可以抛出异常提示非法操作,或静默忽略 throw new InvalidArgumentException('核心用户ID变量不允许被修改'); } // 其他变量正常处理 $this->$name = $value; } }
注意:必须将$_idUtente设为protected或private,否则直接赋值时不会触发__set方法。
方案3:使用PHP只读属性(PHP 7.1+)
如果项目兼容PHP 7.1及以上版本,可使用readonly关键字声明变量,确保仅能在构造函数中赋值,后续无法修改:
class MY_Controller extends CI_Controller { private readonly int $_idUtente; public function __construct() { parent::__construct(); $user = $this->ion_auth->user()->row(); $this->_idUtente = $user->id; } final public function getIdUtente() { return $this->_idUtente; } }
readonly属性的限制最为严格,即使子类或内部代码试图重新赋值,PHP都会直接抛出错误。
内容的提问来源于stack exchange,提问作者redenfire
相关产品推荐
相关产品推荐

