psr-4 是子命名空间映射的唯一正解,必须严格按“前缀+剩余段=目录结构”对齐,双反斜杠与结尾斜杠为硬性语法要求,改配置后须执行 composer dump-autoload 更新 autoload_psr4.php。

子目录类不是“自动跟着父命名空间一起加载”的,必须让 Composer 明确知道子命名空间对应哪段路径层级,否则 Class not found 会直接报给你,而且错误里不提映射问题,只说找不到文件。
psr-4 的子命名空间必须靠目录结构对齐
PSR-4 不支持“为 AppHttp 单独配一条映射”,它只认前缀 + 剩余命名空间段拼路径。比如你写了:"App\": "src/",那 AppHttpClient 就必须落在 src/Http/Client.php;AppHttpControllersHome 就得是 src/Http/Controllers/Home.php。
常见错误现象:
- 类文件放在
src/http/client.php(小写目录)→ Linux/macOS 下加载失败 - 命名空间写成
appHttp或APPHttp→ 不匹配"App\"前缀,完全跳过加载 - 文件名是
client.php但类叫Client→ PSR-4 不查文件内容,只按命名规则找文件
不能用 classmap 替代 psr-4 来映射子命名空间
classmap 是扫目录下所有 PHP 文件、生成类名到路径的静态映射表,它不解析命名空间,也不区分子级——你给它一个 lib/ 目录,它就把里面所有 class 声明都塞进 autoload,但不会帮你把 AppHttpClient 和 lib/Client.php 关联起来。
所以如果你真想按子命名空间组织,就别绕弯子:psr-4 是唯一正解,classmap 只适合无命名空间的老代码或扁平工具类目录。
多个子命名空间共用同一级目录?用数组值
比如你有两套逻辑都放在 src/ 下,但分别属于 AppApi 和 AppConsole,可以这样写:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"autoload": {
"psr-4": {
"App\Api\": "src/",
"App\Console\": "src/"
}
}
注意两点:
- 两个前缀不能互相包含,
"App\"和"App\Api\"同时存在会出问题 - 路径值必须一致(都是
"src/"),否则 Composer 会按顺序匹配,先命中App\就不再看后面的
改完 composer.json 必须运行 dump-autoload
改了 psr-4 配置后,require 'vendor/autoload.php' 还是旧逻辑——Composer 不监听文件变化,它只读 vendor/composer/autoload_psr4.php 这个生成文件。
执行命令:
-
composer dump-autoload:开发时够用 -
composer dump-autoload -o:生成优化版映射,跳过运行时拼路径,推荐 CI/CD 或部署时用
如果仍报错,先跑 composer show --platform 确认当前加载的是不是最新 autoloader;再检查 autoload_psr4.php 里有没有你刚加的前缀——有时候 JSON 格式错一个逗号,dump 就静默失败了。
最常被忽略的一点:双反斜杠和结尾斜杠不是风格问题,是硬性语法要求。"App\" 和 "src/" 少一个 或 /,Composer 就可能当 PSR-0 处理,或者根本忽略这条映射。










