不能自动共存;composer psr-4按路径数组顺序查找,首个匹配的同名类即加载,后续同名类静默跳过;classmap中同名类优先于psr-4生效。

同名类在不同目录下能共存吗? 不能自动共存。Composer 的 PSR-4 加载器一旦在某个映射路径中找到匹配的类文件,就立刻加载并返回,后续同名类会被静默跳过——它不报错,也不警告,只是“看不见”。
比如你配了:"psr-4": { "App\": ["src/", "legacy/src/"] }
而 src/Services/User.php 和 legacy/src/Services/User.php 都定义了 AppServicesUser,那么只有 src/ 下的那个会被加载。
- PSR-4 查找是按数组顺序逐个尝试目录,第一个命中即止
- classmap 中若也登记了同名类(如通过
"classmap": ["legacy/src/"]),且 classmap 已启用,则 classmap 会优先于 PSR-4 生效(因为 autoload 流程是 files → classmap → psr-4) - autoload-dev 中的同名类可以覆盖主 autoload,但仅当运行时启用了 dev 模式(即未加
--no-dev)
PSR-4 多路径映射时谁优先? 看配置里路径数组的书写顺序,不是看物理目录深浅或字母顺序。
写法必须是:"App": ["src/", "legacy/src/"],而不是两个独立键(JSON 不允许重复键)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Composer 会依次检查
src/Services/User.php→ 找到就停;没找到再查legacy/src/Services/User.php - 如果两个路径下都有
User.php,但命名空间声明不同(比如一个写namespace AppServices;,另一个写namespace LegacyServices;),那它们根本不算“同名类”,不会冲突 - 路径值用数组形式(
["src/"])比单字符串("src/")更稳妥,兼容 Composer 各版本,尤其在含多个路径时
classmap 和 PSR-4 同时存在时,同名类怎么选? classmap 总是赢——只要 classmap 表里有这条记录,PSR-4 就完全不触发。
例如:"autoload": { "psr-4": { "App\": "src/" }, "classmap": ["src/Helper.php"] }
而 src/Helper.php 里定义了 class AppHelper,那么 new AppHelper() 会直接走 classmap 加载,哪怕 src/AppHelper.php 也存在且符合 PSR-4 结构。
- classmap 是“精确查表”,PSR-4 是“前缀+路径拼接”,前者匹配更快、更早介入 autoload 流程
- 想让 PSR-4 生效,就得从 classmap 列表里删掉对应路径,或确保 classmap 根本没扫到那个类
- 运行
composer dump-autoload -v可看到 classmap 实际扫描了哪些文件;若某文件被跳过(比如因语法错误),它就不会进表
为什么改了配置却没生效? 最常见原因是没重新生成 autoload 映射,或者路径与实际物理结构对不上。
Composer 不实时扫描文件系统,所有映射都固化在 vendor/composer/autoload_*.php 里。
- 每次修改
composer.json的autoload或增删类文件后,必须手动执行composer dump-autoload - 检查
vendor/composer/autoload_psr4.php,搜索你的命名空间前缀,确认右边路径是否指向你真正放类的目录(比如是__DIR__ . '/../app/'还是错写成'../src/') - 路径末尾少一个反斜杠(如
"App\": "src")会导致类名解析多截一层,映射失效但不报错 - 如果用了
composer dump-autoload -o,classmap 会全量生成,此时 PSR-4 的多路径顺序不再起作用——classmap 查到了就直接加载,连 PSR-4 都不查
autoload_psr4.php 里映射的路径和你本地开发目录不一致。










