psr-4自动加载依赖composer.json中命名空间与路径的严格匹配,如"app\": "src/",且需运行composer dump-autoload生效;路径结尾带/、命名空间结尾带\、文件名大小写敏感、namespace声明必须与配置完全一致。

Composer 的 PSR-4 自动加载不是“实现”出来的,而是通过 composer.json 里正确声明命名空间与路径映射,让 Composer 自动生成并写入 vendor/autoload.php ——你改配置,它就重生成加载逻辑。
PSR-4 映射怎么写才不报 Class not found
核心是命名空间前缀 + 对应的物理路径必须严格匹配,且路径必须真实存在(Composer 不校验路径是否存在,但 autoloader 运行时会失败)。
-
"App\": "src/"表示所有以App开头的类,都从src/目录下按命名空间子目录结构查找,比如AppHttpControllerHomeController→src/Http/Controller/HomeController.php - 路径结尾必须带
/(否则会被当成文件名),命名空间结尾必须带\(否则可能和子命名空间冲突) - 多个映射按顺序注册,前面的匹配成功就不会继续往后找;但不要让前缀互相包含,比如
"App\"和"AppConsole\"同时存在,后者实际永远不会生效 - 修改后必须运行
composer dump-autoload(或composer install/update)才能更新vendor/composer/autoload_psr4.php
为什么 vendor/autoload.php 包含了你的类却还是找不到
常见于开发中手动创建文件但没刷新 autoload —— Composer 的 PSR-4 映射只是“规则”,真正加载靠的是生成的静态数组文件,它不会实时扫描磁盘。
- 新增类文件后忘记执行
composer dump-autoload,旧的 autoload 文件里根本没有这个映射项 - 文件名大小写不一致:Linux 下
HomeController.php和homecontroller.php是两个文件,但类名HomeController只能对应前者 -
composer.json放在子目录(如app/composer.json),但你在项目根目录运行composer dump-autoload,结果改的是错的文件 - 用了
classmap或files加载方式混在一起,优先级干扰导致预期类没被 PSR-4 覆盖到
composer dump-autoload -o 和默认模式的区别
-o(optimize)会把 PSR-4 映射扁平化为完整类名 → 文件路径的静态数组,跳过运行时拼接路径的开销;但代价是灵活性下降、调试困难、且无法支持动态路径(比如环境变量拼路径)。
- 未加
-o:每次加载类时,autoloader 拿到AppHttpControllerX,先查App\ → src/,再拼出src/Http/Controller/X.php,再file_exists() - 加了
-o:直接查一个大数组['AppHttpControllerX' => '/full/path/src/Http/Controller/X.php'],快但体积大、生成慢、不响应文件增删(除非重新 dump) - CI/CD 或生产环境建议用
-o;本地开发频繁改类名/路径时,别加,避免反复 dump
PSR-4 最容易被忽略的其实是命名空间声明和文件路径的「双重一致性」:PHP 文件顶部的 namespace 必须和 composer.json 里写的前缀完全对齐,中间不能多空格、不能少反斜杠、不能用正斜杠 —— 这些地方出错,错误信息永远只显示 Class not found,不会告诉你哪一环断了。










