ci4配置机制彻底重构:采用面向对象+psr-4自动加载,配置项为app/config/下类的public属性,如database.php中必须定义public $default = [...],键名大小写敏感,且需配合.env文件驱动环境变量,硬编码php配置被禁用。

CI3 和 CI4 的配置文件根本不在同一套体系里
不是“路径不一致”这么简单,而是整个配置机制重构了:CI3 用的是全局 $config 数组,所有配置都靠 application/config/*.php 返回数组;CI4 改用面向对象 + PSR-4 自动加载,每个配置项是一个类的 public 属性,路径固定在 app/Config/ 下,比如 app/Config/Database.php。强行把 CI3 的 database.php 复制过去会直接报错——框架根本不会去加载它。
数据库配置写错位置或类型就启动失败
CI4 的 app/Config/Database.php 必须是类定义,$default 是 public 属性,值必须是关联数组,且键名大小写敏感(如 'hostname' 不能写成 'hostName')。常见错误包括:
- 把整个 CI3 的
return [ ... ];块直接贴进 CI4 类里,导致语法错误 - 漏掉
public $default = [ ... ];中的public关键字,PHP 8+ 会静默忽略属性声明 - 把字符串值写成数组,例如
'port' => [3306]而不是'port' => 3306,CI4 不做类型转换,连接时抛出未捕获异常 - 修改了
app/Config/Database.php却没清空writable/cache/下的配置缓存,改了也白改
Base URL 配置错位会导致静态资源全 404
CI3 的 $config['base_url'] 在 application/config/config.php 里;CI4 的等效配置是 app/Config/App.php 中的 public $baseURL。这个值必须是完整 URL(含协议和域名),不能带子目录路径(如 http://localhost/myapp/),除非你真把项目部署在子目录且已配好 rewrite 规则。典型错误:
- 照搬 CI3 的写法:
$config['base_url'] = 'http://localhost/myproject/';→ CI4 里这行完全无效 - 在
App.php里写成public $baseURL = '/myproject/';(缺协议和域名)→view()渲染的 CSS/JS 链接变成http://localhost/css/app.css,而不是预期的http://localhost/myproject/public/css/app.css - 本地开发用
php spark serve时,$baseURL应设为http://localhost:8080/,否则 public 目录下的资源无法被正确解析
环境配置要靠 .env 文件驱动,不是改 config.php
CI4 默认关闭 application/config/ 下所有 PHP 配置文件的硬编码方式,改用 .env 文件统一管理环境变量。比如数据库凭据应该写在 .env 里:
database.default.hostname = localhost database.default.username = root database.default.password = database.default.database = myapp
而不是去改 app/Config/Database.php。如果同时在 .env 和类里写了同名配置,.env 优先级更高。容易被忽略的是:.env 文件必须放在项目根目录(与 public/ 同级),且不能被 Web 服务器直接访问(Apache/Nginx 需屏蔽 .env 路径)。











