PSR-4自动加载严格按命名空间前缀、目录映射和文件名三者一致定位类文件,不扫描目录也不读取PHP内容;合法映射要求命名空间前缀必须以双反斜杠结尾(如"App\"),目录路径为相对于composer.json的相对路径,且不能以/开头。

Composer 的 PSR-4 自动加载不是“猜路径”,而是严格按命名空间前缀 + 目录映射 + 文件名三者一致来定位类文件;它不扫描目录,也不读取 PHP 文件内容,只依赖 composer.json 中的声明和 composer dump-autoload 生成的映射表。
PSR-4 映射怎么写才合法?关键看反斜杠和路径格式
必须在 composer.json 的 "autoload"."psr-4" 中声明,且命名空间前缀**必须以双反斜杠结尾**("App\\"),否则 Composer 会降级为 PSR-0 处理或报错;目录路径是相对于 composer.json 所在位置的**相对路径**,不能以 / 开头。
-
"App\\"→"src/":表示所有App\Xxx类从src/Xxx.php或src/Xxx/Yyy.php加载 -
"Tests\\"→"tests/":支持多前缀并存,但每个前缀只能对应一个目录 - 错误写法:
"App": "src/"(缺反斜杠)、"/src/"(绝对路径)、"App\\": "/src/"(混合非法)
类文件路径为什么总报 Class not found?三处必查点
90% 的加载失败不是配置语法错,而是结构不匹配。自动加载器拿到 App\Controller\UserController 后,会做三步操作:截掉前缀 App\ → 剩余部分 Controller\UserController 转成路径 Controller/UserController → 拼上目录得 src/Controller/UserController.php。任意一环断开就失败。
- 命名空间声明漏反斜杠:
namespace AppController;应为namespace App\Controller; - 文件路径与命名空间层级不一致:比如
App\Controller\UserController却放在src/Controllers/UserController.php(多了s) - 大小写敏感问题:Linux 下
src/Controller/和src/controller/是两个目录,Windows 可能不报错但部署到服务器就挂
dump-autoload 为什么必须手动执行?它到底干了什么
vendor/autoload.php 不会随 composer.json 修改自动更新。运行 composer dump-autoload 实际做了两件事:解析 psr-4 配置,生成 vendor/composer/autoload_psr4.php(一个返回映射数组的 PHP 文件);同时更新 vendor/autoload.php 的加载逻辑入口。
- 开发时可加
-o:运行composer dump-autoload -o会额外生成autoload_classmap.php,跳过运行时路径拼接,直接查表,提升性能 - CI/CD 中应固定用
composer install --no-dev --optimize-autoloader,避免本地未提交的vendor/干扰 - 常见误操作:在子目录下执行命令、改了配置但忘记运行、或运行后没检查是否在项目根目录
最易被忽略的是:PSR-4 只负责类、接口、trait,不加载函数或常量;它也不支持通配符、软链接推导或 IDE 自动生成的嵌套命名空间——只要有一层目录名或命名空间名大小写/拼写不一致,就会静默失败,不会报错提示你哪一层错了。










