PSR-4自动加载基于命名空间前缀与物理目录的显式映射,通过composer.json配置(如"MyApp\\": "src/"),生成autoload_psr4.php查表加载,需注意反斜杠结尾、路径一致性及执行composer dump-autoload生效。

Composer 的 PSR-4 自动加载不是黑盒,它靠的是映射规则 + 文件路径约定 + 自动注册的 autoload.php,核心在于“命名空间前缀”与“物理目录”的显式绑定。
PSR-4 是什么:不是自动发现,而是约定映射
PSR-4 不要求你把类文件按命名空间一层层嵌套到 src/ 下(那是 PSR-0 的老思路),而是允许你定义一个“命名空间前缀”对应一个“根目录”,之后类名中剩余部分(去掉前缀)会被转换为相对路径去查找文件。
比如配置:
"App\\": "src/"
那么 App\Controller\HomeController 就会尝试加载 src/Controller/HomeController.php —— 中间的 App\\ 被剥离,剩下的 Controller\HomeController 直接转成路径 Controller/HomeController.php,再拼上根目录 src/。
关键点:
• 命名空间末尾必须带反斜杠(App\\,不是 App),否则匹配失败
• 类名必须严格对应文件名(HomeController.php 里必须声明 class HomeController)
• 文件扩展名固定为 .php,不支持 .inc 或其他后缀
如何在 composer.json 中正确配置 PSR-4
打开项目根目录下的 composer.json,在 autoload 字段中写入映射:
- 单个前缀示例:
"autoload": { "psr-4": { "MyApp\\": "src/" } } - 多个前缀可并列(常用于分离应用代码和测试代码):
"autoload": {
"psr-4": {
"MyApp\\": "src/",
"MyApp\\Tests\\": "tests/"
}
} - 开发时若想让 Composer 立即生效,运行:
composer dump-autoload(或简写 composer du)
这会重新生成 vendor/autoload.php 和映射表 vendor/composer/autoload_psr4.php
Composer 自动生成了什么?看懂 autoload_psr4.php
执行 composer dump-autoload 后,Composer 会在 vendor/composer/ 下生成一个 autoload_psr4.php 文件。它本质是一个返回关联数组的 PHP 脚本,结构类似:
return array('MyApp\\' => array($baseDir . '/src'),
'MyApp\\Tests\\' => array($baseDir . '/tests'),
);
这个数组就是运行时自动加载器查表的依据。当 new MyApp\Controller\HomeController() 被触发时:
• 自动加载器提取前缀 MyApp\\
• 查表得路径 $baseDir . '/src'
• 剩余部分 Controller\HomeController → 转为 Controller/HomeController.php
• 最终尝试 require $baseDir . '/src/Controller/HomeController.php'
常见错误与排障技巧
如果类找不到(Class not found),别急着改代码,先检查这几点:
- composer.json 中命名空间是否以反斜杠结尾("MyApp\\" ✅,不是 "MyApp" ❌)
- 类文件是否真的放在预期路径下(如 src/Controller/HomeController.php),且文件名大小写完全一致(Linux 下敏感!)
- 类文件顶部是否正确定义了命名空间:
namespace MyApp\Controller;(必须与 PSR-4 映射前缀能拼出完整类名) - 是否忘了运行 composer dump-autoload?修改配置后不执行这步,更改不会生效
- 用 composer show --platform 或查看 vendor/composer/autoload_psr4.php,确认映射已写入
不复杂但容易忽略。










