运行 composer install 后自动加载类从预编译的静态映射文件加载,而非动态生成;vendor/autoload.php 仅启动 autoload_real.php 并注册加载器,真实映射存于 vendor/composer/autoload_psr4.php 等快照文件中,需手动执行 composer dump-autoload 更新。

运行 composer install 后,自动加载类不会“动态生成”,而是从已有的映射快照中加载并注册预编译的加载逻辑——真正干活的是 vendor/autoload.php 引入的一整套静态映射文件,不是运行时扫描或反射。
vendor/autoload.php 只是启动器,不包含映射数据
它本身几乎不写死任何路径或命名空间,只做三件事:引入 autoload_real.php、实例化 ComposerAutoloadClassLoader、调用 $loader->register()。所有 PSR-4 映射都存在 vendor/composer/autoload_psr4.php 这类文件里,内容就是一个硬编码数组,比如:['App\' => ['src/']]。这个数组是在上次 composer dump-autoload 或 install/update 时根据 composer.json 生成的,不是每次请求都重新解析。
autoload_psr4.php 等文件怎么来的?
Composer 在执行 composer install 时,会检查 composer.lock 是否存在且完整。如果存在,就直接读取其中记录的依赖版本,并还原整个 vendor/ 目录结构;同时,它会读取项目根目录下 composer.json 的 autoload 字段(如 psr-4),然后生成或复用 vendor/composer/autoload_*.php 文件:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
autoload_psr4.php:存放所有 PSR-4 映射(注意命名空间末尾必须带反斜杠) -
autoload_classmap.php:来自classmap配置或composer dump-autoload -o生成的全量类名→路径表 -
autoload_files.php:用于files类型的自动加载(如全局函数文件) - 这些文件全部是 PHP 数组字面量,无逻辑、无 IO、无缓存判断,加载极快
为什么改了 composer.json 却没生效?
因为 composer install 默认不重写 autoload 映射文件——它只还原 lock 文件里锁死的依赖和已生成的 autoload 结构。你改了 composer.json 的 autoload.psr-4,但没运行 composer dump-autoload,那 autoload_psr4.php 就还是旧的。常见错误现象包括:
-
Class AppControllerHome not found,但文件明明在src/Controller/Home.php - 命名空间写成
"App": "src/"(缺反斜杠),导致匹配失败 - 路径写成
"src"而不是"src/"(少斜杠),拼出的路径变成srcController/Home.php - 在 CLI 脚本里漏掉
require 'vendor/autoload.php',而 Web 入口又正常,误以为是环境问题
require 'vendor/autoload.php' 必须放在最前面
这不是风格建议,是执行顺序铁律。PHP 解析到第一个 new 或静态调用时,就会触发 autoloader 注册链;如果此时 spl_autoload_register() 还没被调用,就直接抛 Class not found,不会重试。所以:
- 不能包在
if、函数、try/catch里 - 不能出现在任何类实例化、静态方法调用、常量访问之前
- CLI 和 Web 入口要各自显式 require,它们不共享 autoload 注册状态
- 用
include替代require是隐形炸弹:路径错时不报错,只静默失败
最易被忽略的点:autoload 映射不是“活”的——它不监听文件变化、不实时扫描目录、不按需重建。它是快照,靠 composer dump-autoload 手动刷新。哪怕你把 src/ 里所有类文件删光,只要没重跑这命令,autoload_psr4.php 里还记着旧路径,PHP 就会继续去加载不存在的文件,然后报 failed to open stream。










