CodeIgniter上手核心是区分CI3与CI4:目录结构、路由、模型、类加载互不兼容;CI4有spark文件、用命名空间和app/Controllers/,CI3用application/controllers/和CI_Controller;配置、命令、环境变量均不可混用。
不是靠“学完文档”就能上手的框架,它最核心的门槛其实就一个:
搞清你用的是 CI3 还是 CI4
。这两个版本在目录结构、类加载、路由写法、模型机制上几乎互不兼容。选错版本,90% 的教程和报错都会把你带偏。
确认你正在用 CodeIgniter 3 还是 4
打开项目根目录,看有没有
文件 —— 有就是 CI4;没有、但有
且入口指向
,基本是 CI3。
CI3 的控制器继承
,放在
;CI4 的控制器继承
,用命名空间,放在
。
常见踩坑:
立即学习
“
PHP免费学习笔记(深入)
”;
照着 CI4 教程配
,却在 CI3 项目里改这个文件 → 报错
在 CI3 里写
→ 直接 500,因为 CI3 的路由是数组赋值:
用 CI4 的
命令,但在 CI3 环境下运行 → 提示
CI4 启动服务前必须检查 .env
CI4 默认禁用
,哪怕你重命名了
,也得确认
中这行没被注释:
否则所有
、
都不会生效,连
都可能启动失败或连不上数据库。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
关键点:
必须放在项目根目录(和
同级)
数据库配置项名要严格匹配 CI4 规范:
,不是
开启调试模式:
,否则错误全被吞掉,只显示白屏
CI3 路由和 URL 重写最容易卡住
CI3 默认 URL 带
,比如
。想去掉它,光配
不够,还得改两处:
中设
中确保
指向已存在的控制器类名(注意大小写,CI3 区分)
Apache 必须启用
,且虚拟主机配置中
已开
典型错误现象:
去掉
后,所有页面 404 → 检查
是否放在和
同级,内容是否为官方标准版(含
或对应子目录)
访问
显示 “404 Page Not Found”,但
正常 →
未生效或
被限制
模型传参别硬套 Laravel 风格
CI4 的
类默认启用软删除、时间戳自动填充,但这些行为都依赖字段存在且命名规范:
想用
软删,表里必须有
字段(类型
)
调用
时,如果模型设置了
,但表里没有
字段 → 插入失败,无提示
CI3 的模型不自动处理时间戳,得手动写:
更隐蔽的问题:CI4 的
返回单条记录时是数组(非对象),而
返回对象数组;CI3 全是数组。混用会导致
这类错误。
真正容易被忽略的地方是:CI4 的模型默认开启
,但如果你在构造函数里改了
,后续所有方法返回类型就变了 —— 这个设置不会被继承,每个模型得单独确认。
CodeIgnitersparkindex.phpsystem/CI_Controllerapplication/controllers/Controllerapp/Controllers/app/Config/Database.phpClass "Config\Database" not found$routes->get('/', 'Home::index')$route['default_controller'] = 'home';php spark make:model UserCommand "make:model" is not defined.envexample.envapp/Config/Boot/environment.phpif (file_exists(APPPATH . 'Config/Environment.php'))
{
require_once APPPATH . 'Config/Environment.php';
}APPNAMEdatabase.default.hostnamephp spark serve.envsparkdatabase.default.hostnamedb['default']['hostname']CI_ENVIRONMENT = developmentindex.phphttp://localhost/index.php/welcome.htaccessapplication/config/config.php$config['index_page'] = '';application/config/routes.php$route['default_controller']mod_rewriteAllowOverride Allindex.php.htaccessindex.phpRewriteBase //welcome/index.php/welcomemod_rewriteAllowOverrideModel$this->delete(5)deleted_atDATETIME NULL$this->insert()protected $useTimestamps = truecreated_at$data['created_at'] = date('Y-m-d H:i:s');find()findAll()Trying to get property 'name' of non-objectreturnType = 'array'$this->returnType = 'object'