autoload 配置只写在 composer.json 的 autoload 字段中,vendor/autoload.php 是自动生成的;psr-4 要求命名空间与路径严格对齐,如 "app\": "src/";classmap 与 psr-4 混用时命中即止,无需纠结顺序;类找不到需检查是否执行 dump-autoload、工作目录是否正确及 namespace 是否拼写错误。

autoload 配置写在哪?不是 composer.json 就是它
Composer 自动加载类的唯一入口是项目根目录下的 composer.json 文件里的 autoload 字段。改别的地方(比如 vendor/autoload.php)没用,那是生成出来的,每次 composer dump-autoload 都会被覆盖。
常见错误现象:Class not found 却反复检查文件路径和命名空间,结果发现 composer.json 根本没配 autoload,或者写在了 autoload-dev 里却在非开发环境运行。
-
autoload用于生产环境 + 开发环境都生效的类 -
autoload-dev只在本地开发、测试时加载(比如tests/下的类) - 配置完必须运行
composer dump-autoload才会更新vendor/autoload.php
PSR-4 怎么写才不报错?路径和命名空间必须严格对齐
PSR-4 不是“自动猜路径”,而是靠命名空间前缀映射到磁盘目录,中间的命名空间分隔符 必须转成系统路径分隔符(/ 或 ),末尾不能带 /,目录名也不能有大小写偏差。
使用场景:你希望 AppControllersHomeController 对应 src/Controllers/HomeController.php,那就得让 App 映射到 src/ 目录。
- 正确写法:
"App\": "src/"—— 注意双反斜杠转义,结尾斜杠可选但推荐保留 - 错误写法:
"App": "src"(少一个反斜杠,JSON 解析失败)、"App\": "src"(缺结尾斜杠,可能导致找不到子目录) - 如果命名空间是
AppFooBar,文件就必须在src/Foo/Bar.php,不能是src/foo/bar.php(Linux 下大小写敏感)
classmap 和 PSR-4 混用时,谁先被加载?顺序不重要,命中就停
Composer 加载器内部是按注册顺序尝试的,但实际影响不大——一旦某个自动加载规则根据类名匹配到对应文件并成功 require,就立刻返回,后续规则根本不会触发。所以混用时不用纠结“哪个优先”,重点是别让两个规则同时能加载同一个类(否则行为不可控)。
性能影响:PSR-4 是动态路径拼接,classmap 是查表(生成的 vendor/composer/autoload_classmap.php),后者更快;但 classmap 不支持动态新增类,每次加新文件都要重跑 composer dump-autoload。
- 适合 classmap 的场景:遗留代码、无统一命名空间的老项目、或想极致优化启动速度的 CLI 工具
- PSR-4 更灵活,开发时增删类无需重新 dump,推荐新项目只用它
- 不要把同一命名空间既配 PSR-4 又配 classmap,容易自己绕晕
为什么 vendor/autoload.php 被 require 后还是找不到类?检查这三处
90% 的“已引入 autoload 却 Class not found”问题,出在以下三个地方,而不是 Composer 本身坏了。
- 没执行
composer install或composer dump-autoload—— 生成的 autoload 文件压根不存在或过期 - PHP 运行时工作目录不是项目根目录,导致相对路径映射失效(比如从
public/下执行脚本,但composer.json在上层) - 类文件里用了
namespace但拼错了,或用了use却没写全限定名,PHP 解析时根本没走到自动加载阶段
最容易被忽略的是工作目录问题:哪怕 composer.json 配得再准,require __DIR__.'/../vendor/autoload.php'; 中的 __DIR__ 如果不在预期位置,整个映射就偏了。










