ci3升级后库加载失败需检查:文件名和类名首字母大写、删除namespace;index.php中在codeigniter.php前引入vendor/autoload.php(路径含../);必须用$this->load->library()而非new;补全config.php中的encryption_key。

升级后 $this->load->library() 找不到类?检查文件路径和命名规范
CodeIgniter 3 的自动加载机制比 CI2 更严格,application/libraries/ 下的类必须满足:文件名首字母大写(如 Mylib.php),类名完全匹配(class Mylib),且不能带命名空间。CI2 容忍小写文件名(mylib.php)或类名大小写不一致,CI3 在 Linux 环境下直接报 “Unable to locate the library”。
常见错误包括:
-
application/libraries/email.php→ CI3 不认,必须重命名为Email.php -
class email→ 必须改为class Email - 类中用了
namespace→ CI3 默认忽略命名空间,删掉namespace行,或改用 Composer 加载
composer autoloader 不生效?入口文件没提前引入
CI3 不自动包含 vendor/autoload.php,哪怕你已运行 composer install 并生成了 vendor/ 目录。框架启动流程先加载 CodeIgniter.php,再执行你的代码,此时 Composer 类尚未注册。
必须在 index.php 中、require_once BASEPATH.'core/CodeIgniter.php'; 之前插入:
if (file_exists(APPPATH . '../vendor/autoload.php')) {
require_once APPPATH . '../vendor/autoload.php';
}
注意路径是 APPPATH . '../vendor/autoload.php'(即项目根目录下的 vendor/),不是 APPPATH . 'vendor/autoload.php'。漏掉 ../ 是最常踩的坑。
原来 CI2 里 new Mylib() 能用,CI3 报错 Class not found?别绕过加载器
CI2 允许手动实例化库类(new Mylib()),CI3 禁止这种用法——尤其当类依赖 $this->config 或 $this->db 时,手动 new 出来的对象没有框架上下文,会触发未定义属性或方法错误。
正确做法始终是:
- 用
$this->load->library('Mylib')加载 - 调用
$this->mylib->method()(注意:CI3 默认把类名转为小写作为属性名) - 不要在控制器里
require_once库文件,也不要用include或new
升级后 session 或 encryption 类报错?加密密钥缺失
CI3 对 session 和 encryption 库要求显式配置 encryption_key,CI2 可能默认容忍空值。若没设,会抛出 Undefined property: CI_Encryption::$key 或 session 启动失败。
解决方式:
- 打开
application/config/config.php - 确认
$config['encryption_key'] = 'your-32-char-random-string-here';已设置(长度建议 32 字符) - 若不确定,可在控制器中临时运行:
echo bin2hex($this->encryption->create_key(16));生成新 key
这个 key 必须在所有环境保持一致,否则已加密的 session 数据将无法解密——这点容易被忽略,上线前务必核对。











