psr-4需手动配置并执行composer dump-autoload生效,命名空间与路径须严格一一对应,反斜杠需双写、路径不能以/开头、文件名大小写必须精确匹配,测试代码应置于autoload-dev中隔离。

PSR-4 不是“生成”的,是手动配 + 手动刷出来的
改完 composer.json 里的 autoload 配置,不会自动生效。Composer 不监听文件变化,它只读 vendor/composer/autoload_psr4.php 这个编译后的静态映射表——而这个文件,必须靠你主动运行命令重建。
- 开发中执行:
composer dump-autoload - 生产环境或追求性能时加
-o(优化模式):composer dump-autoload -o,生成扁平 classmap,跳过运行时路径拼接 - CI/CD 中建议固定用:
composer install --no-dev --optimize-autoloader,避免本地未提交的 autoload 文件干扰部署
命名空间和路径写法,错一个字符就 Class not found
最常翻车的是反斜杠:JSON 里 "App" 是非法转义,会被解析失败或降级为 PSR-0;正确写法必须是 "App\"(两个反斜杠)。同理,路径不能以 / 开头(如 "/src/" 是绝对路径,不合法),也不能缺末尾斜杠导致拼成 srcMyClass.php。
- ✅ 正确示例:
"App\": "src/"、"Tests\": "tests/" - ❌ 错误写法:
"App"、"App"、""、"\"(空或根命名空间会破坏全局类加载,Composer 7+ 直接拒绝) - 路径必须指向真实存在的目录,否则
dump-autoload不报错,但运行时才爆Class not found
文件结构必须和命名空间严格一一对应
Composer 不扫描目录,也不猜文件名。它只做一件事:把 AppHttpClient 拆成 App + Http/Client,再拼到 src/ 后面,得到 src/Http/Client.php。所以路径、大小写、文件名,三者必须完全一致。
- 类
AppHttpMiddlewareAuth→ 必须存为src/Http/Middleware/Auth.php - 文件名必须和类名完全一致(大小写敏感):
ApiResponse.php里只能有class ApiResponse,不能是apiresponse.php或ApiResponse2.php - Linux/macOS 下
src/Http/Client.php和src/http/client.php是两个不同路径,后者永远加载不到
测试类别混进主 autoload,也别用空字符串兜底
测试代码不该进生产自动加载表。用 autoload-dev 单独配,既隔离作用域,又防止被误引入线上流程。另外,用 ""(空字符串)作为命名空间前缀虽技术上可行,但它会让所有非限定类名(比如 new Foo())都去指定目录下找,极易覆盖 Exception、PDO 等核心类,引发致命错误。
- ✅ 推荐方式:
"autoload-dev": { "psr-4": { "App\Tests\": "tests/" } } - ❌ 危险操作:
"": "src/"或"\": "src/" - 第三方包的 autoload 已由其自身
composer.json定义,你的项目里重复映射不仅多余,还可能冲突
最容易被忽略的,其实是大小写一致性——Windows 下看着能跑,一上 Linux 就 Class not found。别依赖文件系统宽容,从第一天起就让命名空间、目录名、文件名、类名,四者保持完全一致。










