第三方类库必须按规范路径存放并配合对应加载方式:无命名空间类放application/libraries/(CI3)或app/Libraries/(CI4),文件名与类名严格一致且首字母大写;命名空间类须用Composer安装至vendor/并手动引入vendor/autoload.php;$this->load->library()第二参数非配置项,CI4推荐注册进服务容器而非沿用Loader。

CodeIgniter 本身不自动加载第三方库,直接丢进 application/ 目录下任何位置都不会生效。必须按规范路径 + 加载方式组合使用,否则必然报错 Unable to load the requested class。
第三方类库该放哪?别碰 system/ 和 vendor/ 顶层
CI3 和 CI4 对路径敏感,放错就找不到:
- 无命名空间、纯 PHP 类(如
SimpleXLSX.php、MyPdf.php):必须放进application/libraries/(CI3)或app/Libraries/(CI4),且文件名与类名严格一致、首字母大写(MyPdf.php→class MyPdf) - 带命名空间的现代库(如
monolog/monolog、guzzlehttp/guzzle):绝不能放libraries/,必须用 Composer 安装到项目根目录vendor/,再手动引入 autoload -
third_party/是历史遗留路径,仅用于手动$this->load->library('third_party/simplexlsx.class')这种临时加载,不推荐长期维护
Composer 库怎么用?漏掉 autoload.php 就白装
CI 不像 Laravel 那样默认加载 vendor/autoload.php,你得自己补上,否则 new \GuzzleHttp\Client() 会直接报 Class not found:
- CI3:在
index.php中define('FCPATH', ...)后加一行:require_once FCPATH . 'vendor/autoload.php'; - CI4:在
public/index.php中require FCPATH . 'vendor/autoload.php';(通常已存在,确认没被注释) - 确保
vendor/和index.php同级,路径写错会导致整个应用崩溃 - 之后直接
use或new,完全不用$this->load->library()
$this->load->library() 的参数陷阱:第二个参数不是配置项
很多人写成 $this->load->library('curl', ['timeout' => 30]),以为能传配置——这是错的。CI 的 library() 方法第二个参数只接受布尔值(是否启用别名),传数组会被忽略,配置根本不会生效:
- 正确做法是:先
$this->load->library('curl'),再通过$this->curl->set_timeout(30)(如果类支持)或读取$this->config->item('curl_timeout')手动设置 - 若第三方类本身不提供 setter,就得在封装类里自己处理配置,比如在
application/libraries/Api_client.php构造函数中读取$this->ci->config->item('api_timeout') - 错误传参不会报错,但后续行为不可控(比如 cURL 永远用默认 60 秒超时)
CI4 服务容器 vs CI3 Loader:别混用初始化逻辑
CI4 推荐把第三方类注册进服务容器(app/Config/Services.php),而不是沿用 CI3 的 $this->load->library():
- CI4 中,
$this->load->library()仍可用,但属于兼容层;新项目应优先在Services::myclient()中返回实例,然后用service('myclient')获取 - CI3 没有服务容器,所有类都走
Loader,强行套用 CI4 写法会导致Service 'myclient' is not available - 混合项目(如 HMVC 扩展)可能已有自定义加载逻辑,重复
require vendor/autoload.php会触发Cannot redeclare class
最易被忽略的是命名空间类和非命名空间类的加载路径隔离——放错目录、漏引 autoload、误用 load->library(),三者任一出错都会让类“存在却不可用”,调试时得逐层确认文件位置、类声明、引入语句、调用方式是否全部对齐。


















