PSR-4配置不生效的主因是composer.json中autoload位置错误、命名空间缺双反斜杠、路径大小写/格式不符,或未执行composer dump-autoload;autoload必须为顶层键,命名空间须以"\"结尾,路径用"/"结尾且不可向上跳转,类文件名与命名空间严格逐字符对应。

PSR-4 配置不生效,基本就是 composer.json 写错位置、命名空间结尾少反斜杠、路径大小写不对,或者压根没运行 composer dump-autoload。
autoload 必须是 composer.json 的顶层键
它不能嵌在 require、scripts 或其他字段里,也不能拼错成 autoloader 或 auto-load。Composer 只认和 name、require 并列的 autoload 字段:
{
"name": "my/app",
"require": { ... },
"autoload": { ← 必须在这里,一级缩进
"psr-4": {
"App\": "src/"
}
}
}
- 如果写在
require-dev里,Composer 完全忽略 - 如果写成
"autoloading",不会报错,但也不会生效 - CI/CD 中常因配置被误塞进条件块(如
if: ${{ env.TESTING }})而静默失效
命名空间必须以双反斜杠结尾,路径必须用正斜杠且结尾
JSON 里写 "App\",PHP 解析后才是带一个反斜杠的 "App";路径写 "src/",不是 "src"、"./src/" 或 "/src/":
-
"App"❌:匹配失败,会被当成 PSR-0 兼容模式跳过 -
"App\"✅:正确前缀,加载器才能做字符串前缀匹配 -
"src"❌:拼路径时变成srcMyClass.php,而不是src/MyClass.php -
"src/"✅:保证目录分隔符统一,避免跨平台问题 -
"../src/"❌:Composer 禁止相对上级路径,会直接拒绝解析
类文件路径必须和命名空间逐字符对齐
Composer 不扫描文件,只做字符串替换。给定 "App": "src/" 和类名 AppHttpControllersUserController,它会:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 剥离前缀
App→ 得到HttpControllersUserController - 把
全替换成/→Http/Controllers/UserController - 拼上路径
src/+.php→src/Http/Controllers/UserController.php
所以:
- 目录名必须是
Http,不是http(Linux/macOS 区分大小写) - 文件必须叫
UserController.php,不能是usercontroller.php或Controller.php -
namespace行不能有前导空格:namespace AppHttpControllers;✅,namespace AppHttpControllers;❌
改完必须手动运行 composer dump-autoload
vendor/autoload.php 只是注册加载器,真正起作用的是 vendor/composer/autoload_psr4.php —— 这个文件不会自动更新:
- 执行
composer install或update时,只有锁文件变更才会触发 dump,日常改autoload不会触发 - 开发阶段用
composer dump-autoload(不加-o),能暴露路径错误;加了-o会生成 classmap,绕过 PSR-4 路径检查,反而掩盖问题 - 可以快速验证:运行
var_dump(include 'vendor/composer/autoload_psr4.php');,确认你的前缀是否出现在数组里 - 多个 PSR-4 映射共存时,注意前缀不能重叠,比如
"App\": "src/"和"AppHttp\": "legacy/"会导致后者永远不命中
最常被忽略的一点:修改 composer.json 后,不运行 dump-autoload 就去测 new 类,结果当然是 Class not found —— 而且 Composer 从不提示你“你忘了刷新映射”。

















