Composer 的 PSR-4 自动加载依赖 composer.json 中 "autoload"."psr-4" 配置及执行 composer dump-autoload 生成映射,命名空间、目录结构、文件名须严格一致,否则导致类找不到。

Composer 的 PSR-4 自动加载不是靠手写 autoload 函数实现的,而是通过 composer.json 中的 "autoload" 配置 + 运行 composer dump-autoload 生成规范的加载器。手动干预 ClassLoader 或改写 vendor/autoload.php 属于反模式,绝大多数情况没必要也不推荐。
PSR-4 映射必须写在 composer.json 的 "autoload" 字段里
PSR-4 规则由 Composer 内置的 ClassLoader 解析执行,只认 composer.json 中声明的映射。它不读取 PHP 文件里的注释、不扫描目录结构、也不自动推断命名空间。
-
"autoload"下用"psr-4"键声明映射,格式为{"Namespace\\": "src/"}—— 注意末尾反斜杠和路径的对应关系 - 命名空间前缀必须以
\结尾(如"App\\"),否则 Composer 会当作 PSR-0 处理或报错 - 目录路径是相对于
composer.json所在位置的相对路径,不能以/开头(即不能写绝对路径) - 同一个命名空间前缀只能映射一个目录;若需多目录,得拆成多个键,或改用
"classmap"
运行 composer dump-autoload 才真正生效
修改 composer.json 后,vendor/autoload.php 不会自动更新。必须显式执行命令生成新的自动加载映射表。
- 开发中建议加
-o(optimize)参数:生成优化后的静态映射,跳过文件系统扫描,提升加载速度 - 如果用了
classmap或动态注册了额外路径,需加--no-dev或--dev控制作用域 - CI/CD 中应固定使用
composer install --no-dev --optimize-autoloader,避免依赖未提交的本地vendor/
常见错误:类找不到(Class not found)的三个高频原因
90% 的 PSR-4 加载失败不是配置语法错,而是路径或命名不匹配。
- 类文件路径与命名空间不一致:比如命名空间是
App\Controllers\Home,但文件放在src/Controllers/HomeController.php—— 正确路径应为src/Controllers/Home.php(类名 = 文件名,无Controller后缀) - 目录权限或大小写问题:Linux 下
src/Controllers/和src/controllers/是不同路径,但 Windows 可能不报错,导致跨平台部署失败 - 忘记执行
composer dump-autoload,或执行时在错误目录(比如不在项目根目录下)
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}
PSR-4 映射本身很简单,难的是保持命名空间、目录结构、文件名三者严格一致;一旦引入软链接、符号路径或 IDE 自动生成的嵌套命名空间,就容易漏掉某一层的反斜杠或大小写。每次新增类后,先确认路径再跑 autoload 命令,比事后查 Class not found 快得多。










