CI3升级到CI4是破坏性重写而非兼容升级:需改用Composer安装、Web根目录指向public/、控制器加namespace并继承BaseController、路由改用Routes.php方法注册、数据库等核心机制全部重构。
CI3 到 CI4 不是升级,是重写;直接覆盖
或改
必然白屏、
。
PHP 版本和安装方式必须先对齐
CI4 要求 PHP 7.2.5+(实际建议 7.4+ 或 PHP 8.0+),且不再支持旧版 MySQL 驱动(如
)。用 Composer 安装是主流方式,Web 根目录必须指向
,不是
所在目录。
检查当前环境:
、
禁用旧扩展(如
中注释掉
)
新建项目用
,别在原项目上硬改
命名空间和控制器继承关系全变了
CI3 的
在 CI4 里不存在,所有控制器必须加
,并继承
。不加命名空间或写错路径,类根本不会被自动加载。
CI3 控制器:
CI4 控制器:
模型同理:命名空间为
,继承
自定义核心类(如
)要重写为服务提供者,在
中注册
路由和中间件配置不能照搬,语法和作用域都不同
CI3 的
在 CI4 里会 404,因为新路由系统不识别这种字符串替换,也不再通过全局数组注册。
CI4 路由文件是
,必须用
、
等方法显式声明
参数占位符写法是
或
,但需配合闭包或控制器方法签名,例如:
权限校验等逻辑不能塞进控制器构造函数,必须注册中间件类,并在路由中绑定:
调试模式开启需同时满足两个条件:Web 环境为
,且
被正确加载,否则
无效
数据库操作、库加载和自动加载机制彻底重构
CI3 的
和
全部失效;CI4 用依赖注入 + 工厂模式管理实例,类名、命名空间、自动加载路径错一个就报
。
模型不再用
,而是构造函数注入或
第三方库不能放
后直接
,得手动 new 或用工厂:
自定义 helper 函数要放进
,并按 PSR-4 命名(如
→
),再在
中
加载
的配置格式与 CI3 不同,
改为
,
改为
(字段名一致但结构嵌套更深)
最常被忽略的是:CI4 没有“超级对象”,
、
这些不是自动挂在控制器上的属性,而是通过服务容器按需解析。一旦命名空间写错、类没注册、或
中服务定义遗漏,就会静默失败或抛出找不到类的致命错误——连日志都不一定记录清楚。
system/index.phpFatal error: Class 'CI_Controller' not foundmysql_*public/index.phpphp -vphp -m | grep -E "(mbstring|json|xml|curl)"php.iniextension=php_mysql.dllcomposer create-project codeigniter4/appstarterCI_Controllernamespace App\Controllers;BaseControllerclass Welcome extends CI_Controller { ... }namespace App\Controllers; class Welcome extends BaseController { ... }App\ModelsCodeIgniter\Modelapplication/core/MY_Controller.phpapp/Config/Services.php$route['news/(:any)'] = 'news/view/$1';app/Config/Routes.php$routes->get()$routes->post(){id}(:num)$routes->get('news/{id}', 'News::view');$routes->add('admin/*', ['middleware' => 'auth']);developmentapp/Config/Boot/development.phpini_set('display_errors', '1')$this->load->model()$this->load->library()Class not found$this->load->model()$model = model('NewsModel');application/libraries/$this->load->library()\CodeIgniter\Config\Factories::libraries('MyLib');app/Helpers/url_helper.phpurl_helperapp/Config/Constants.phphelper()app/Config/Database.phphostnamehostusernameusername$this->db$this->sessionapp/Config/Services.php