Composer PSR-4 自动加载要求命名空间以\结尾、目录相对根目录且不以/开头,类名与文件名(大小写敏感)、目录结构、namespace声明、composer.json配置四者必须严格一致,修改后需运行composer dump-autoload生效。

Composer 的自动加载不是魔法,而是靠 vendor/autoload.php 注册了一个 PHP 自动加载函数,并依据你在 composer.json 中写的 psr-4 映射规则,把类名精准转成文件路径后 require 进来——只要命名空间、目录结构、配置三者对得上,它就工作;对不上,就报 Class not found。
怎么写对 composer.json 的 psr-4 配置?
核心是「前缀 + 目录」的映射,且反斜杠和路径结尾的斜杠都有讲究:
-
psr-4键值对中,命名空间必须以\结尾(如"App\\": "src/"),这是为了防止App和AppKernel冲突;漏掉或写成/会导致匹配失败 - 目录路径是相对于项目根目录的,不能以
/开头(比如不能写"/src/"),也不能用绝对路径 - 支持多个映射,例如同时加载应用代码和工具类:
{ "autoload": { "psr-4": { "App\\": "src/", "Utils\\": "lib/utils/" } } } - 修改后必须运行
composer dump-autoload才生效;开发中可加-o生成优化版(composer dump-autoload -o),跳过运行时路径拼接,提升性能
为什么类文件放对位置还是加载失败?
常见不是配置错,而是路径和命名空间没严格对齐。PSR-4 是机械式字符串替换,不智能纠错:
- 类
App\Controller\UserController必须放在src/Controller/UserController.php—— 注意:中间层级Controller是目录名,不是命名空间别名 - 文件名必须与类名完全一致(大小写敏感!):
UserController.php≠usercontroller.php,在 Linux 环境下直接报错 -
namespace声明必须完整,且末尾无多余空格或 BOM 字符;常见错误是写了namespace App\Controller;却把文件放在src/controller/UserController.php(小写controller) - 如果用了 IDE 自动生成类,确认它没偷偷加了
use或改了命名空间层级
自动加载器到底怎么找到文件的?
当你执行 new App\Controller\UserController(),Composer 加载器实际做了三件事:
- 调用
spl_autoload_register()注册的回调函数,接收完整类名App\Controller\UserController - 查
vendor/composer/autoload_psr4.php里的映射表,发现App\\→src/ - 把类名去掉前缀,剩下
Controller\UserController,再把\替换成/,拼出路径src/Controller/UserController.php;最后require它 - 如果文件不存在,就静默失败(除非启用了
--classmap-authoritative,此时会直接抛错)
最常被忽略的一点:PSR-4 不处理文件内容,只管路径。哪怕你把 UserController.php 里写的是 class Post,只要路径对,它也会“成功加载”——但运行时立刻报错。所以,命名空间、类名、文件名、目录结构,四者必须咬死对齐,缺一不可。










