跳转到主内容
极星编程网:以代码为星,赴技术山海!

PHP编程CodeIgniter怎么学_PHP框架学习【教程】

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

相关文章