CI3与CI4常量机制本质不同:CI3要求核心常量在index.php中提前define,自定义常量统一放application/config/constants.php;CI4由.env或环境变量驱动环境,推荐用app/Config/Constants.php定义全局常量,更多场景应使用配置类而非define。

CodeIgniter 3 和 4 在常量定义机制上表面相似,但底层时机、作用域和推荐方式有本质差异——不是“怎么写”,而是“在哪写、何时生效、谁来管”。
框架级常量的定义时机不同
CI3 要求 ENVIRONMENT、FCPATH 等核心常量必须在 index.php 中、加载框架前就用 define() 声明。CI4 则改用 Composer 自动加载 + 引导文件(app/Config/App.php 或 public/index.php)初始化,ENVIRONMENT 等已由系统自动处理,开发者一般无需手动 define。
- CI3:不提前定义
ENVIRONMENT,就会默认进入development模式,且无法被后续逻辑覆盖 - CI4:环境由
.env文件或服务器环境变量驱动,define('ENVIRONMENT', ...)不仅多余,还可能干扰自动检测
应用级常量的存放位置与加载逻辑不同
CI3 明确保留 application/config/constants.php 作为唯一安全的 define() 执行点;CI4 完全弃用该路径,不再提供默认 constants.php 文件,也不在启动流程中自动 require 它。
- CI3:所有自定义常量应统一写入
application/config/constants.php,框架会在早期自动加载 - CI4:若需全局常量,建议在
app/Config/Constants.php(需自行创建)中定义,并在public/index.php或app/Config/Boot/production.php等引导文件中显式 include —— 否则不会生效 - CI4 更鼓励用配置类(
$config['key'])替代部分常量,尤其涉及环境切换的值(如 API 超时、调试开关)
常量与配置项的边界更清晰
两者都支持 define() 和 $config[],但 CI4 通过服务容器和环境感知配置强化了语义分离:
-
define()仍适合绝对不变的标识符(如APP_NAME、UPLOAD_PATH),但必须确保在服务初始化前完成 -
$config['key']在 CI4 中更多由Config\App类实例管理,可通过config('App')->key获取,支持运行时覆盖、环境继承(.env→Config\App→ 方法调用) - CI4 禁止在配置类中混用
define(),否则会导致 IDE 提示冲突、调试器显示多个同名符号
升级时的兼容性注意点
从 CI3 迁移到 CI4 时,直接复制 constants.php 文件会失效——它不会被自动加载,也不会报错,只是静默忽略。
- 检查旧项目中所有
define(),区分哪些是真正不可变的(可迁移到新Constants.php),哪些本该是配置项(应改写为Config\App属性) - 避免在 CI4 的控制器构造函数里依赖未声明的常量;CI4 的依赖注入不解析常量,只注入服务实例
-
BASEPATH、APPPATH等路径常量在 CI4 中仍存在,但由自动引导流程定义,不应再手动重写


















