composer dump-autoload 默认生成 vendor/composer/autoload_classmap.php 等类映射文件,仅重建自动加载映射,不安装包或更新依赖;支持 --classmap-authoritative 强制只用 classmap 并跳过文件检查。

composer dump-autoload 会生成什么
composer dump-autoload 默认只重建自动加载映射(即 vendor/autoload_classmap.php 和 vendor/composer/autoload_classmap.php),不安装包、不更新锁文件、不写入新依赖。它读取 composer.json 中的 autoload 和 autoload-dev 配置,扫描对应路径下的 PHP 文件,提取 class、interface、trait、enum 声明,生成类名到文件路径的关联数组。
这个过程比 composer install 或 composer update 快得多,适合在 CI/CD 中快速刷新类映射,或开发时手动触发以让新类被识别。
常见错误现象:执行后 Class not found 仍存在——大概率是类文件没被 autoload 规则覆盖,或用了 PSR-4 但命名空间与目录结构不匹配。
怎么确保只生成 classmap(不走 PSR-4/PSR-0)
composer dump-autoload 默认行为是“混合模式”:同时生成 classmap + PSR-4 映射(如果配置了)。要强制只用 classmap,必须显式禁用其他自动加载方式:
- 在
composer.json 中移除或注释掉 "psr-4"、"psr-0"、"files" 字段,只保留 "classmap"
- 运行
composer dump-autoload --classmap-authoritative,该标志会让 autoloader 完全信任 classmap,跳过文件系统检查(提升性能,但新增类必须重新 dump)
- 若需临时只扫特定目录进 classmap,可用
composer dump-autoload --classmap-authoritative --no-dev + 在 classmap 数组中明确列出目录,例如:"autoload": {
"classmap": ["src/", "legacy/"]
}
注意:--optimize 已废弃(Composer 2.2+),现在等价于 --classmap-authoritative;而 --no-dev 会影响是否包含 autoload-dev 下的 classmap 路径。
为什么有时 dump-autoload 后新类还是不生效
这通常不是命令本身的问题,而是映射逻辑没覆盖到:
- 类文件扩展名不是
.php(如 .inc、.class.php)→ classmap 默认只扫 .php,需加 "extensions": ["php", "inc"] 到 composer.json 的 autoload.classmap 下(Composer 2.2+ 支持)
- 类定义在条件块里(如
if (DEBUG) { class A {} })→ classmap 扫描器不执行代码,会跳过这类声明
- 使用了动态类名(
class_alias、eval)→ classmap 无法静态分析,必须靠 files 或运行时加载
- 项目根目录下有
vendor/autoload.php 但应用没 require 它 → dump 只生成文件,不自动接入运行环境
CI 环境中推荐的最小安全命令
在部署或测试阶段,如果只需要确保类能被找到,且不希望意外更新依赖,就用:
composer dump-autoload --classmap-authoritative --no-dev --optimize-autoloader
其中:
-
--no-dev:排除 autoload-dev,减小映射体积
-
--optimize-autoloader:等价于 --classmap-authoritative,强制只走 classmap 查找
- 不加
--force,避免覆盖手工修改的 autoload 文件(虽然不建议手改)
复杂点在于:一旦启用 --classmap-authoritative,所有类必须提前出现在 classmap 中;漏掉一个,就是 Class not found,而且不会 fallback 到文件扫描——这点容易被忽略。
composer.json 中移除或注释掉 "psr-4"、"psr-0"、"files" 字段,只保留 "classmap"
composer dump-autoload --classmap-authoritative,该标志会让 autoloader 完全信任 classmap,跳过文件系统检查(提升性能,但新增类必须重新 dump)composer dump-autoload --classmap-authoritative --no-dev + 在 classmap 数组中明确列出目录,例如:"autoload": {
"classmap": ["src/", "legacy/"]
}
- 类文件扩展名不是
.php(如.inc、.class.php)→classmap默认只扫.php,需加"extensions": ["php", "inc"]到composer.json的autoload.classmap下(Composer 2.2+ 支持) - 类定义在条件块里(如
if (DEBUG) { class A {} })→ classmap 扫描器不执行代码,会跳过这类声明 - 使用了动态类名(
class_alias、eval)→ classmap 无法静态分析,必须靠files或运行时加载 - 项目根目录下有
vendor/autoload.php但应用没 require 它 → dump 只生成文件,不自动接入运行环境
CI 环境中推荐的最小安全命令
在部署或测试阶段,如果只需要确保类能被找到,且不希望意外更新依赖,就用:
composer dump-autoload --classmap-authoritative --no-dev --optimize-autoloader
其中:
-
--no-dev:排除 autoload-dev,减小映射体积
-
--optimize-autoloader:等价于 --classmap-authoritative,强制只走 classmap 查找
- 不加
--force,避免覆盖手工修改的 autoload 文件(虽然不建议手改)
复杂点在于:一旦启用 --classmap-authoritative,所有类必须提前出现在 classmap 中;漏掉一个,就是 Class not found,而且不会 fallback 到文件扫描——这点容易被忽略。
--no-dev:排除 autoload-dev,减小映射体积--optimize-autoloader:等价于 --classmap-authoritative,强制只走 classmap 查找--force,避免覆盖手工修改的 autoload 文件(虽然不建议手改)











