PSR-4映射必须手动配置在composer.json顶层autoload字段,命名空间须以双反斜杠结尾,路径为相对子路径且建议加尾部斜杠,命名空间、路径、类名须严格一一对应,修改后必执行composer dump-autoload。

PSR-4 映射必须手动写进 composer.json 的顶层 autoload 字段
Composer 不会“猜”你的命名空间在哪,更不会扫描目录自动生成映射——你写什么,它就信什么。漏掉一个反斜杠、多一个空格、嵌错一层 JSON,new AppHttpControllerHome() 就直接报 Class not found。
-
autoload必须是composer.json的顶层键,不能塞在require里,也不能缩进两层 - 命名空间键必须以双反斜杠结尾:
"App\": "src/"✅,"App": "src/"❌(PHP 字符串中单个是转义符) - 路径值是相对于
composer.json所在目录的子路径,不支持../或绝对路径,也不接受./src/这种带点前缀的写法 - 路径末尾建议加
/:"src/"比"src"更安全,避免和同名文件(如src.php)冲突
命名空间、文件路径、类名三者必须严丝合缝对齐
PSR-4 不是模糊匹配,而是确定性拼接:给定 AppUserRepository,Composer 会严格拼出 src/User/Repository.php 并检查是否存在。差一级目录、大小写错一位、文件名多一个 Controller 后缀,全都会失败。
- 命名空间声明必须完整且结尾无多余空格:
namespace AppUserRepository;✅,namespace AppUserRepository ;❌ - 文件路径必须逐段对应命名空间层级:
AppHttpControllersHome→src/Http/Controllers/Home.php - Linux/macOS 下
src/http/controllers/≠src/Http/Controllers/,Windows 开发也请全程保持大小写一致,否则上线即崩 - 类名必须与文件名完全一致(包括大小写):
class ApiResponse→ 文件必须叫ApiResponse.php,不是apiresponse.php或ApiResponseController.php
composer dump-autoload 不是可选项,是必跑步骤
改完 composer.json 后,vendor/autoload.php 不会自动更新。它只加载 vendor/composer/autoload_psr4.php,而这个文件只有执行 composer dump-autoload 才会重写。
- 开发中可加
-o(即--optimize)生成静态 classmap,跳过运行时路径拼接和文件存在性检查,加载更快 -
composer install或update默认会触发 dump,但仅限于依赖变更;你自己加的映射,必须手动跑一次 - CI/CD 部署时建议固定用
composer install --no-dev && composer dump-autoload -o,避免本地未提交的 autoload 配置污染线上 - 如果仍报错,先运行
composer show --platform确认当前 autoloader 是否已包含你的新映射
别把测试类配进主 autoload,也别混用 classmap 和 psr-4
把 Tests 命名空间配在主 autoload 里,看似省事,实则埋雷:测试类会被加载进生产环境,可能触发副作用或性能损耗。
- 测试类应单独配置在
autoload-dev中:"autoload-dev": { "psr-4": { "Tests\": "tests/" } } -
classmap适用于无命名空间的老代码或类名/文件名不一致的情况,但它不支持命名空间别名,新增类后必须重新dump-autoload -
files只用于全局函数或常量定义(如helpers.php),不能用来加载类,否则会重复定义报错 - 空字符串
""或根命名空间"\"是非法前缀,Composer 7+ 会直接拒绝安装
实际最难的不是写对那几行 JSON,而是保持命名空间、目录结构、类声明三者在每次新建类时都同步更新——少一次 dump-autoload,或 IDE 重命名类时没同步改文件名,问题就立刻浮现。











