ci3升级到ci4是破坏性重写而非兼容升级:需改用composer安装、web根目录指向public/、控制器加namespace并继承basecontroller、路由改用routes.php方法注册、数据库等核心机制全部重构。

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










