APP_NAMESPACE是CodeIgniter 4全局命名空间唯一控制开关,必须在app/Config/Constants.php中定义,并同步更新类文件namespace声明和$psr4映射,三者不一致将导致Class not found。

CodeIgniter 4 的全局命名空间不能“设”,只能“对齐”——APP_NAMESPACE 是唯一开关,改它就必须同步改三处,漏一处就 Class not found。
APP_NAMESPACE 常量在哪改、为什么只能在这改
全局命名空间由 app/Config/Constants.php 中的 define('APP_NAMESPACE', 'App') 唯一控制。这不是一个可选配置项,而是整个 PSR-4 自动加载契约的起点。框架启动时先读它,再据此解析所有 namespace 声明和 $psr4 映射。你改其他地方(比如直接在类里写 namespace MyApp 却不碰这个常量),等于让加载器按“App”找,而类声明自己是“MyApp”,自然找不到。
常见错误包括:
- 只改了
Constants.php,没批量替换所有类文件顶部的namespace App... - 在
app/Controllers/Home.php里写了namespace MyAppControllers,但Constants.php还是'App' - 误以为改
Autoload.php就够了,结果常量和命名空间声明没跟上
$psr4 映射怎么写才不拼错路径
$psr4 数组不是“告诉框架去哪找类”,而是定义“命名空间前缀 → 物理路径”的映射规则。它拼接逻辑是:物理路径 + 类名中去掉命名空间前缀的部分 + .php。所以路径末尾必须带斜杠,命名空间前缀末尾必须带反斜杠。
正确写法示例(假设你想用 MyApp):
$psr4['MyApp\'] = APPPATH;
错误写法及后果:
-
$psr4['MyApp\'] = APPPATH . 'Controllers';→ 拼成APPPATH . 'Controllers' . 'Controllers/Home.php',多了一层Controllers -
$psr4['myapp\'] = APPPATH;→ PSR-4 要求前缀首字母大写,小写不匹配 -
$psr4['MyApp'] = APPPATH;→ 缺少末尾反斜杠,命名空间匹配失败 - Windows 下写
'MyAppLibrary'不转义 → PHP 把L当作转义字符,路径崩掉
类文件里的 namespace 声明必须和物理路径严格对应
命名空间不是装饰,它直接决定文件该放哪。例如,app/Libraries/PaymentGateway.php 如果声明 namespace AppLibraries;,那它必须能被 $psr4['App\'] = APPPATH; 覆盖;如果声明 namespace MyAppLibraries;,那 $psr4 必须映射到 MyApp\,且文件路径得是 app/Libraries/PaymentGateway.php(因为 MyAppLibraries → 去掉前缀剩 Libraries,拼路径就是 APPPATH . 'Libraries/PaymentGateway.php')。
容易忽略的细节:
- 控制器
app/Controllers/Admin/Dashboard.php的命名空间必须是AppControllersAdmin(不是AppControllers或AppAdmin) - 实体类
app/Entities/User.php若声明namespace AppEntities;,那它就在AppEntitiesUser这个完整限定名下,不能省略Entities - 别在
system/或public/下加自定义namespace—— 这些目录不参与应用级 PSR-4 加载,写了也白写
改完不生效?缓存和重启比代码还关键
CI4 默认启用配置缓存,app/Config/Autoload.php 和 Constants.php 都会被编译进缓存文件。改完不清理,等于没改。
开发环境必须做两件事:
- 执行
php spark cache:clear或手动删掉writable/cache/下所有文件 - 如果正在用
php spark serve,改完后必须重启服务 —— 它不会热重载配置
生产环境更麻烦:不能直接改 autoload.php 后上线,得先运行 php spark optimize 生成新缓存,再部署。否则线上跑的还是旧映射。
最常被跳过的其实是三者一致性本身:你以为 $psr4 写对了,但类文件里漏改 namespace,或者路径里多了一层子目录,问题就出在这儿,而不是 autoload 配置本身。


















