composer仅做字符串前缀匹配与路径拼接,不解析命名空间合法性;"app"与"app"在json中解析结果不同,前者导致错误匹配,后者正确识别为命名空间前缀;psr-4映射按最长前缀优先,修改composer.json后需运行composer dump-autoload更新autoload_ps4.php,且文件路径大小写必须严格一致。

Composer 不解析命名空间,只做字符串前缀匹配和路径拼接。它根本不管你的 namespace 是不是合法 PHP 语法,也不校验类是否存在——只要类名以你配的前缀开头,就按规则“砍掉前缀 + 替换分隔符 + 拼路径”。错一个字符,Class not found 立刻报给你。
为什么 "App" 和 "App\" 完全不同
这是最常踩的坑:JSON 解析阶段就决定成败。
-
"App"❌:JSON 中无转义,被解析为字面量字符串"App",Composer 当作完整类名前缀处理(比如找AppHttpController.php) -
"App"✅:双反斜杠在 JSON 中表示一个反斜杠,最终被识别为命名空间前缀App,能正确匹配AppHttpController -
"App\"❌(Windows 下尤其易错):PHP 字符串里四个反斜杠才等于两个,但 JSON 层只认两个;多写反而导致解析失败或截断
路径拼接逻辑:不扫描、不 fallback、不纠错
Composer 的映射不是“查找”,而是“计算”:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 类名
AppHttpControllersHome→ 去掉前缀App→ 得到剩余部分HttpControllersHome - 把
全替换成/→ 得到Http/Controllers/Home - 拼到你配的路径后 →
src/Http/Controllers/Home.php - 这个文件必须真实存在,且大小写完全一致(
home.php或HomeController.php都不行)
多个 PSR-4 映射共存时谁优先
不是看配置顺序,而是看前缀长度:“最长前缀优先”。
-
"App\": "src/"和"AppHttp\": "src/http/"可以共存 - 但
new AppHttpControllersHome会命中"AppHttp\"(更长),而不是"App\" -
"App\"和"AppController\"同时存在时,后者永远无法触发——因为AppControllerFoo也以App开头,且App更短,先被匹配
改完 composer.json 为什么还是 Class not found
因为 vendor/autoload.php 读的是 vendor/composer/autoload_psr4.php 这个生成文件,不是实时解析 composer.json。
- 必须手动运行
composer dump-autoload(开发)或composer dump-autoload -o(生产) - CI/CD 中推荐用
composer install --no-dev --optimize-autoloader,避免本地残留的 autoload 文件干扰 - 临时验证?直接
var_dump(include 'vendor/composer/autoload_psr4.php');,看数组里有没有你配的"App\" => ["src/"]
真正容易被忽略的,是路径大小写和文件名大小写的严丝合缝——Linux/macOS 下 src/Http/ ≠ src/http/,哪怕 namespace 写对了,文件放错目录照样加载失败。










