psr-4映射路径必须严格匹配:命名空间键须双反斜杠结尾(如"app\"),路径值为相对composer.json的目录且不以/开头(如"src/"),修改后须执行composer dump-autoload生效。

psr-4 映射路径怎么写才不翻车
PSR-4 不是“大概对得上就行”,而是严格按字符串替换规则查文件:命名空间前缀被完全剥离,剩余部分转为路径拼到配置目录后。漏掉末尾反斜杠 "App\" 就会当成 PSR-0 兼容模式静默失效;路径写成 "src/App/" 会导致 App\User 去找 src/App/User.php,而实际类在 src/User.php。
-
"App\"必须带双反斜杠(PHP 字符串中表示一个\),"App": "src/"是错的 -
"src/"是相对于composer.json所在目录,不是项目根、不是当前工作目录 - Linux 下大小写敏感:命名空间
App\Http\Controllers→ 目录必须是src/Http/Controllers/,不能是src/http/controllers/ - 类文件名必须与类名完全一致:
class HomeController→ 文件必须叫HomeController.php,不能是homecontroller.php
classmap 扫哪些路径才安全
classmap 不走命名空间推导,只扫描你指定的路径或文件,把所有 class/interface/trait 声明提取出来建表。它适合无命名空间的老代码,但扫错目录会卡死或报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 别写
"classmap": ["vendor/"]或["./"]—— Composer 不支持通配符,且会尝试解析整个 vendor 目录,极慢甚至中断 - 优先写具体路径或文件:
"classmap": ["legacy/", "lib/Helper.php"] - 路径必须真实存在,不存在的目录不会报错,但也不会生成对应映射
- 含语法错误的 PHP 文件会让
composer dump-autoload直接失败,报ParseError
files 配置里放什么、怎么放
files 是唯一每次加载都 require_once 的机制,顺序固定、无条件执行,但它不是用来加载类的——放类文件会和 PSR-4 冲突,导致 Fatal error: Cannot declare class。
- 只放纯函数、常量、
define()、class_alias()等无副作用代码 - 路径是相对于
composer.json的完整路径:"src/helpers.php"✅,"./src/helpers.php"❌,"helpers.php"❌ - 数组顺序 = 执行顺序:
"files": ["src/constants.php", "src/helpers.php"],后者可安全使用前者定义的常量 - 禁止在
files里做new PDO()、file_get_contents()等操作——这些会在dump-autoload过程中就执行,命令直接崩
autoload-dev 生效的前提是什么
autoload-dev 区块只在 --no-dev 未启用时才参与加载。CI 构建脚本若默认加了该参数(比如 composer install --no-dev --optimize-autoloader),那 "Tests\": "tests/" 整个映射就根本不会注册,Class 'Tests\TestCase' not found 就是必然结果。
- 本地开发跑
phpunit时,确保没手动加--no-dev - CI 脚本里要显式去掉
--no-dev,或改用composer install --dev -
autoload-dev里的files和psr-4同样受此开关控制,不是“仅测试时生效”,而是“仅 dev 依赖安装时才加载” - 验证是否生效:运行
composer show -s | grep -A5 autoload,看输出里有没有你的 dev 映射项
composer.json 的 autoload 段,不跑 composer dump-autoload 就等于没改;而跑完之后,如果类还是找不到,90% 的问题出在路径拼写、命名空间末尾反斜杠、或 Linux 下大小写不一致——这些地方没有模糊空间,错一点就全错。










