psr-0 在 composer 2.0+ 中已被彻底移除,含 "psr-0" 字段会直接报错;psr-4 要求命名空间前缀以双反斜杠结尾,路径映射比 psr-0 少一层,且完全忽略下划线,混用需谨慎。

PSR-0 在 Composer 2.0+ 中已完全消失,不是“不推荐”,是根本不能存在——只要 composer.json 里有 "psr-0" 字段,composer install 或 composer dump-autoload 就会直接报错退出。
为什么 composer dump-autoload 报 [InvalidArgumentException] A non-empty PSR-4 prefix must end with a namespace separator
这个错误和 PSR-0 无关,纯粹是 PSR-4 配置写错了。Composer 解析 "psr-4" 时,要求每个命名空间前缀必须以反斜杠结尾,且 JSON 中必须写成双反斜杠(因为单个反斜杠在 JSON 里是转义字符)。
-
"App": "src/"❌:没反斜杠,触发该错误 -
"App/": "src/"❌:用了正斜杠,PHP 命名空间分隔符只能是反斜杠 -
"App": "src/"✅:JSON 解析后实际为"App",符合 PSR-4 要求
注意:哪怕只留 "psr-0": [] 这样空配置,也会让 Composer 2.0+ 拒绝执行。
PSR-4 映射路径比 PSR-0 少一层,这是迁移时最常出问题的地方
假设你原来用 PSR-0 配置 "App": "src/",类 AppControllersHome 对应的文件路径是 src/App/Controllers/Home.php;换成 PSR-4 后,同样配置下,它要找的是 src/Controllers/Home.php。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 旧项目里如果真有
src/App/目录,那它是冗余的,得手动把子目录(如Controllers/、Models/)提到src/下一级 - 不挪目录,只改
composer.json,会导致类加载失败,但错误信息只有Class not found,不会提示具体缺哪个路径 - 如果项目混用多个命名空间前缀(比如
"App"和"Tests"),各自路径要独立检查,不能默认套用同一结构
下划线 _ 在类名里是否被当路径分隔符,是行为级断裂点
PSR-0 会把 My_Class_Name 拆成 My/Class/Name.php;PSR-4 完全无视下划线,只认类名字面值 —— 所以它必须对应 My_Class_Name.php,且文件名大小写、下划线一个都不能错。
- 旧代码里大量
Vendor_Core_Utils这种类名?别指望 PSR-4 自动加载它们 - 不想重命名类,就别硬套 PSR-4;改用
"classmap": ["legacy/"]让 Composer 扫描生成静态映射更可靠 - 哪怕只漏掉一个含下划线的类,它也不会在
dump-autoload阶段报错,而是在运行时突然找不到 —— 这类问题最难排查
autoload-dev 和 autoload 不是简单“开发/生产”开关
autoload-dev 里的 PSR-4 规则,和 autoload 是分开注册的,且优先级更低。这意味着:
- 如果
autoload和autoload-dev都配置了"Tests": "tests/",运行时只会走autoload的规则(因为它先注册) - 测试类被
autoload覆盖后,可能意外进入生产环境加载逻辑,引发权限或路径问题 - 真正安全的做法是:把测试专用命名空间(如
"Tests\Feature\")单独配在autoload-dev,且确保autoload里不包含任何重叠前缀
迁移旧库时,最容易被忽略的不是语法格式,而是那些从没被单元测试覆盖、也从没在 CLI 命令中显式引用过的类 —— 它们依赖 PSR-0 的下划线拆解或嵌套路径行为,一旦切换到 PSR-4,就彻底隐身了。










