CI4与CI3完全不兼容,因核心机制、加载方式、命名空间和生命周期不同;CI3为全局过程式,CI4强制PSR-4自动加载、命名空间隔离和服务容器管理。

不能混用。CI4 和 CI3 的核心机制、加载方式、命名空间和生命周期完全不同,强行复用对方的库文件(尤其是非纯函数类)大概率会报错,比如 Class 'CI_Controller' not found、Call to undefined method 或 Cannot declare class … because the name is already in use。
根本冲突点在哪
CI3 的库是面向过程+全局加载设计,依赖 $this->load->library();CI4 则强制 PSR-4 自动加载、命名空间隔离、服务容器管理。两者不兼容,不是“改个文件名就能用”的问题:
- CI3 库通常没有命名空间,CI4 自动加载器会因找不到命名空间而跳过或报错
- CI3 库常直接访问
$this->db或$this->input,但 CI4 中这些对象不在控制器作用域内,也不再通过$this统一代理 - CI3 的
config/数组式配置、helpers/函数自动载入机制,在 CI4 中已废弃,对应功能需通过服务或依赖注入实现 - 文件路径语义不同:CI3 的
application/libraries/对应 CI4 的app/Libraries/,但后者必须声明namespace App\Libraries;并符合 PSR-4 规则
想复用逻辑,推荐这几种安全做法
不是“搬代码”,而是“重写接口、保留逻辑”:
-
抽离纯业务逻辑到独立 PHP 类:把数据处理、算法、格式转换等无框架依赖的代码单独写成普通类(不继承、不调用
$this->xxx),放在app/Services/或app/Utils/下,加命名空间,CI4 可直接 new 或通过服务容器调用 -
用 CI4 服务封装旧库功能:把 CI3 库的核心方法重构成一个 CI4 服务类(如
App\Services\OldCacheService),在app/Config/Services.php中注册为共享实例,控制器里用service('oldCacheService')调用 -
保留 CI3 库作参考,重写为 CI4 风格:例如原 CI3 的
MY_Encrypt.php,可新建app/Libraries/Encrypter.php,用namespace App\Libraries;,构造函数接收所需依赖(如Encryption服务),方法返回值而非设置$this属性 -
避免直接 require/include CI3 文件:即使只是读取配置数组,也建议手动复制关键参数,而不是
require APPPATH.'config/database.php'—— CI4 的app/Config/Database.php是类,结构完全不同
特别注意多环境共存场景
如果项目中同时存在 CI3 和 CI4 子应用(比如后台用 CI4、前台遗留模块用 CI3),务必物理隔离:
- 两个项目分属不同域名或子路径(如
admin.example.comvslegacy.example.com),严禁共享system/或vendor/ - 数据库连接、Session、缓存等共享资源需统一配置,但各自初始化——CI4 用
Config\Database类,CI3 用config/database.php数组,不要共用配置文件 - 公共工具函数(如日期格式化、字符串截断)建议提取为 Composer 包或独立
helpers/目录,由双方分别引入,不依赖框架上下文
不复杂但容易忽略


















