ci4构造函数必须显式调用parent::__construct()以初始化session、database等服务,否则虽执行但依赖为空;ci3需手动加载非默认配置或配置autoload.php,且composer需在index.php中提前引入autoload.php。

CodeIgniter 的配置加载顺序出错,通常不是“顺序能随便调”,而是不同版本对配置加载机制的设计逻辑不同——CI3 和 CI4 的行为差异很大,搞混就会导致配置不生效、服务未初始化、类找不到等问题。关键不是手动“调整顺序”,而是按框架规范正确触发加载时机。
CI4:构造函数里必须显式调用 parent::__construct()
CI4 中控制器的 __construct() 不会自动执行父类初始化。如果你在构造函数里用了 $this->session 或 $this->db 却报错或为空,大概率是漏了这行:
-
必须写:
parent::__construct();—— 它负责加载核心服务(session、database、cache 等) - 不写这句,构造函数本身会执行,但所有依赖服务都是 null,看起来像“没加载”
- helper、service、model 都应在
parent::__construct()之后调用
CI3:配置文件加载要分清“手工”和“自动”两种路径
CI3 默认只自动加载 config.php 和 database.php,其他自定义配置(如 api_config.php)需主动加载,否则读不到:
-
手工加载:在控制器方法里用
$this->config->load('api_config'); -
全局自动加载:编辑
application/config/autoload.php,把文件名加进$autoload['config'] = ['api_config']; - 注意:如果多个配置文件有同名键(比如都定义了
$config['api_key']),后加载的会覆盖前一个;加第二个参数TRUE可隔离命名空间:$this->config->load('api_config', TRUE)→ 访问时用$this->config->item('key', 'api_config')
CI3 启用 Composer 包前,必须提前引入 autoload.php
CI3 不识别 Composer 自动加载机制,哪怕你 composer require guzzlehttp/guzzle 成功,new \GuzzleHttp\Client() 还是报错。根本原因是 autoloader 没被触发:
- 打开
index.php,在require_once BASEPATH.'core/CodeIgniter.php';之前 插入: if (file_exists(APPPATH . '../vendor/autoload.php')) { require_once APPPATH . '../vendor/autoload.php'; }- 路径必须是
APPPATH . '../vendor/autoload.php'(vendor 在项目根目录,不是 application 下) - 别在控制器里
require_once—— 重复加载且可能失效
路由和 URL 配置错乱,本质是加载链断裂
访问 /home 报 404?不是路由“顺序错了”,而是整个请求链没走通:
-
CI4:必须在
app/Config/Routes.php显式写$routes->get('/home', 'Home::index');,没有“自动发现” -
CI3:检查
application/config/routes.php是否设置了$route['default_controller'] = 'home';,并确认application/controllers/Home.php类名、命名空间(CI3 无命名空间)、继承关系(extends CI_Controller)都正确 - Web 根目录必须指向
public/(CI4)或项目根目录(CI3),baseURL要配对,否则静态资源和重写规则全崩











