composer 2.0+ 已彻底移除 psr-0 实现,仅支持 psr-4;报错“a non-empty psr-4 prefix must end with a namespace separator”是因前缀未用双反斜杠(如"app\": "src/");psr-4 要求目录结构扁平化(如 controllers/ 需置于 src/ 下),且下划线不作路径分隔符,旧类名含下划线或嵌套结构需改用 classmap。

Composer 2.0+ 里根本不存在 PSR-0 的底层实现——它被彻底移除,不是“不启用”,是代码里压根没这玩意儿了。PSR-4 是唯一被解析、注册、执行的自动加载标准。
为什么 composer dump-autoload 会报 “A non-empty PSR-4 prefix must end with a namespace separator”
这个错误和 PSR-0 完全无关,纯属 PSR-4 配置语法写错。Composer 解析 psr-4 时,对命名空间前缀有硬性要求:
-
"App": "src/"❌:没反斜杠,触发该错误 -
"App/": "src/"❌:用了正斜杠,PHP 命名空间分隔符只能是反斜杠 -
"App\": "src/"✅:JSON 中双反斜杠解析为单个反斜杠,实际前缀是App\,符合 PSR-4 规范
PSR-4 映射路径比 PSR-0 少一层,目录必须手动调整
这是迁移中最容易漏掉的实操动作。PSR-0 把整个命名空间都塞进路径,PSR-4 只映射前缀之后的部分:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PSR-0 配置
"App": "src/"→App\Controllers\Home对应src/App/Controllers/Home.php - PSR-4 配置
"App\": "src/"→App\Controllers\Home对应src/Controllers/Home.php - 如果
src/App/目录还存在,它就是冗余的,得把Controllers/、Models/等子目录提到src/下一级 - 不挪目录只改
composer.json,运行时只会报Class not found,不会提示缺哪段路径
下划线 _ 在类名中是否被当路径分隔符,是行为级断裂点
PSR-0 和 PSR-4 在这点上完全不可互换,不是风格差异,是加载逻辑根本不同:
- PSR-0:
My_Class_Name→ 自动拆成My/Class/Name.php - PSR-4:
My_Class_Name→ 必须对应文件My_Class_Name.php,下划线就是类名一部分,大小写、下划线一个都不能错 - 旧项目里有大量
Vendor_Core_Utils这类类名?别指望 PSR-4 能加载它们 - 不想重命名类,就别硬套 PSR-4;用
"classmap": ["legacy/"]让 Composer 扫描生成静态映射更可靠
真正麻烦的不是配置语法,而是那些没在 dump-autoload 阶段暴露、却在运行时突然找不到的类——尤其是含下划线的类名、或仍依赖旧式嵌套目录结构的类。它们不会报错,只会静默失败。










