CodeIgniter 3 不自动加载自定义库,需手动加载;类名与文件名须严格一致;构造函数勿带参或用数组传参;链式调用需方法返回 $this;get_instance() 勿在属性声明中调用;CI 4 改用 PSR-4 加载,路径、命名、方式全不同。

为什么 application/libraries/ 里放了类却报 Class not found
CodeIgniter 3 默认不自动加载自定义库,哪怕文件放在正确路径,不显式加载就等于不存在。它不像 Laravel 那样有自动发现机制。
实操建议:
- 确保类名与文件名完全一致(含大小写),例如类
My_helper必须存为application/libraries/My_helper.php - 类必须声明为
public,且构造函数不能带参数(或需在加载时传参,见下一条) - 在控制器中用
$this->load->library('my_helper')加载 —— 注意这里是小写+下划线,CI 会自动首字母大写并匹配类名 - 如果类构造函数需要参数,得写成数组形式:
$this->load->library('my_helper', ['param' => 'value'])
如何让自定义库支持链式调用或全局可用
默认加载后,库实例挂载在 $this 上(如 $this->my_helper),但无法直接链式调用,除非你在类方法里返回 $this。
实操建议:
- 每个想链式调用的方法末尾加
return $this;,例如:public function set_mode($mode) { $this->mode = $mode; return $this; } - 不要试图在库中访问
$this->load或其他 CI 超级对象 —— 它们不在库作用域内;如需,应通过构造函数注入:public function __construct($params = []) { $this->CI =& get_instance(); } - 若希望多个控制器共用一个实例(而非每次新建),可在
autoload.php中配置:$autoload['libraries'] = array('my_helper');,但注意副作用:所有请求都会初始化它
get_instance() 在自定义库中为什么有时返回 null
根本原因是调用时机不对 —— get_instance() 只能在 CI 核心完成加载后才有效,比如在构造函数里直接调用可能失败,尤其当库被提前加载(如在 config/autoload.php)时。
实操建议:
- 永远把
$this->CI =& get_instance();放在构造函数末尾,且确保构造函数本身没做耗时或依赖操作 - 避免在类属性声明时就调用
get_instance():private $ci = get_instance();是错的,PHP 不允许表达式赋值给属性 - 更安全的做法是懒加载:定义一个
get_ci()方法,在首次需要时才调用get_instance()并缓存
CI 4 迁移时自定义库为什么不兼容
CI 4 彻底弃用了 load->library(),改用 PSR-4 自动加载,所以旧库路径、命名、加载方式全都不适用。
实操建议:
- 把库移到
app/Libraries/,类命名必须匹配命名空间,例如AppLibrariesMyHelper - 在
app/Config/Autoload.php的$psr4数组中注册:'App\Libraries\' => APPPATH . 'Libraries/', - 使用时直接
new AppLibrariesMyHelper()或通过服务容器绑定,不再走$this->load - 别指望 CI 3 的
get_instance()在 CI 4 里还能用;改用service('session')、model()等新接口
最常被忽略的是大小写和命名空间映射 —— 文件系统区分大小写,而 Windows 下容易掩盖问题,一到 Linux 服务器就报错。CI 3 看似简单,但加载链其实很脆弱;CI 4 看似麻烦,但每一步都可验证。










