composer require 默认自动触发 dump-autoload 生成 autoload 映射,但旧版 Composer 或加 --no-autoloader 时需手动执行;首次 install、update 或显式 dump-autoload 也会重建映射。

require 命令本身不生成 autoload 映射
直接运行 composer require vendor/package 后,vendor/autoload.php 并不会“立刻生效”新包的类——它只是把包下载到 vendor/、更新 composer.json 和 composer.lock。真正的自动加载映射由 autoload.php 加载的 vendor/composer/autoload_classmap.php(或其他 autoload 文件)提供,这些文件必须由 composer dump-autoload 或安装类操作触发生成。
autoload 映射在什么时候自动生成
以下任一操作会触发 autoload 映射重建:
- 首次运行
composer install(从composer.lock安装) - 运行
composer update - 手动执行
composer dump-autoload
注意:composer require 默认会自动执行一次 dump-autoload(除非加 --no-autoloader),所以绝大多数情况下你不需要额外操作。但如果你用的是旧版 Composer(--classmap-authoritative),可能需要手动补一发:
composer dump-autoload --optimize
这会强制重生成 autoload_classmap.php,对 PSR-0/PSR-4 包也有效,但仅当它们的 autoload 配置已正确写入 composer.json。
为什么新包的类还是找不到
常见原因不是 autoload 没生成,而是包本身没声明 autoload 规则,或你的项目没启用对应类型:
- 该包的
composer.json里没有"autoload"字段(比如纯脚本工具包,如phpunit/phpunit)→ 它不提供可自动加载的类,require只是为命令行工具准备 - 你 require 的是 dev-only 包(如
phpunit/phpunit),但当前环境不是dev(COMPOSER_DEV=0或--no-dev)→ 它根本不会被安装 - 包用了 PSR-4,但命名空间与目录结构不匹配 → 自动加载器查不到路径,报
Class not found - 你修改了自己项目的
autoload配置(如加了"psr-4": {"App\": "src/"}),但忘了运行composer dump-autoload→ 新增的本地命名空间不会被识别
验证 autoload 是否生效的最快方式
别猜,直接看生成的映射文件或用命令检查:
- 打开
vendor/composer/autoload_classmap.php,搜你期望的类名(如MonologLogger)→ 如果存在对应路径,说明映射已建好 - 运行
composer show -p vendor/package看它的 autoload 配置是否被识别 - 临时加一行测试代码:
var_dump(class_exists('Some\Package\Class'));→ 返回true才算真正可用
最常被忽略的一点:Composer 的 autoload 是「静态映射」,它不扫描文件,只信任 composer.json 里声明的规则和 dump-autoload 时生成的列表。哪怕文件物理存在,只要没进 classmap 或没匹配 PSR 规则,就加载不了。











