在 composer.json 的 autoload 下配置 psr-4,键为带双反斜杠结尾的命名空间前缀(如 "app\": "src/"),值为相对于项目根目录的路径(推荐带尾部 /);需确保命名空间声明、物理路径、配置三者严格一致,并运行 composer dump-autoload 刷新映射。

composer.json 里怎么写 psr-4 配置
直接在 composer.json 的 autoload 下加 psr-4 映射,键是命名空间前缀(必须以双反斜杠结尾),值是相对于项目根目录的路径(推荐带尾部 /):
{
"autoload": {
"psr-4": {
"App\": "src/",
"Tests\": "tests/"
}
}
}
注意:App\ 不是 App 或 App;src/ 不是 ./src/ 或 src(后者虽可能工作,但易在某些 Composer 版本触发警告)。
- 多个命名空间可共存,但不能有前缀重叠,比如不能同时配
"App\"和"App\Http\" - 路径不支持通配符或 glob,只做前缀匹配 + 路径拼接
- Composer 不会扫描整个目录,它只按规则把
AppControllerUser拆成src/Controller/User.php去找
类文件放哪、叫什么名,才真能被加载
PSR-4 不是“自动猜路径”,而是严格按命名空间层级映射到目录结构。配置了 "App": "src/",那 AppServiceLogger 就必须对应 src/Service/Logger.php。
Difeye是一款超轻量级PHP框架,主要特点有: Difeye是一款超轻量级PHP框架,主要特点有: ◆数据库连接做自动主从读写分离配置,适合单机和分布式站点部署; ◆支持Smarty模板机制,可灵活配置第三方缓存组件; ◆完全分离页面和动作,仿C#页面加载自动执行Page_Load入口函数; ◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例
- 文件名必须与类名完全一致(大小写敏感):类
DbRepository→ 文件名DbRepository.php - 命名空间剩余部分(去掉前缀)必须逐级转为子目录:
AppUserRepository→src/User/Repository/ -
src/User.php只能对应AppUser,不能对应AppUserManager(后者需要src/User/Manager.php)
为什么写了配置却还是 Class not found
90% 的问题出在三处不一致:命名空间声明、物理路径、composer.json 配置没对齐。常见现象包括:
- 报错
Class 'AppControllerHome' not found,但文件实际在app/Controller/Home.php—— 配置里却写的是"App\": "src/" - 类里写的是
namespace AppController;,但文件放在src/controller/HomeController.php(小写controller)→ Linux 下直接失败 - 改完
composer.json没运行composer dump-autoload,或者只跑了composer install却忘了它不会重读 autoload(除非锁文件变更)
开发中该用 dump-autoload 还是 update
composer dump-autoload 是唯一正确且轻量的选择——它只刷新自动加载映射,不碰依赖树,也不读 composer.lock。
- 加
-o参数(即composer dump-autoload -o)会生成 classmap 缓存,提升生产环境性能,开发中非必需 -
composer update或install会顺带触发 autoload 重建,但它们代价高、副作用大(可能升级包、改 lock),纯改 autoload 别用它们 - 如果用了
autoload-dev(比如测试类),记得dump-autoload默认不加载 dev 部分,需加--dev参数
最常被忽略的一点:路径和命名空间里的斜杠方向、结尾符号、大小写,不是“差不多就行”,而是“差一个字符就失效”。别靠猜测,用 composer dump-autoload -v 看它实际生成了哪些映射,再比对文件是否存在、是否可读。









