开启了 classmap-authoritative 后 composer 不再 fallback 到 psr-4/psr-0 加载,仅依赖 classmap;必须通过 composer dump-autoload -a 生成完整映射,否则缺失类直接报错。

classmap-authoritative 模式到底关掉 fallback 了吗
开了 classmap-authoritative,Composer 就**不再尝试自动加载未被 classmap 覆盖的类**——哪怕你写了 psr-4 规则,只要那个类没进 classmap,classmap-authoritative 下直接报 Class not found,不会 fallback 到 PSR-4 或 PSR-0 的文件扫描逻辑。
它不是“禁止 fallback 加载”的开关,而是“只信任 classmap”的开关。fallback 本身在 classmap-authoritative 启用后就不存在了,不是被“禁止”,是压根不走那条路径。
- 启用后,
vendor/autoload.php会跳过所有非 classmap 的自动加载器注册(比如PSR4Loader实例) - 只保留
ClassLoader::addClassMap()注册的映射表 - 如果类名不在 classmap 中,
__autoload链里没有后续兜底,PHP 直接抛出Fatal error: Uncaught Error: Class "X" not found
怎么启用 classmap-authoritative 并确保 classmap 完整
光设配置不够,必须让 classmap 包含所有可能用到的类,否则上线就炸。关键在两步:配置 + 生成。
- 在
composer.json顶层加:"classmap-authoritative": true - 运行
composer dump-autoload -a(-a即--classmap-authoritative),它会强制扫描全部源码目录(包括src/、lib/、tests/等)生成完整 classmap - 别用
composer install默认行为——它不会自动加-a,除非你提前配好 config 并加--no-dev(dev 类默认不进 classmap) - 检查生成结果:打开
vendor/composer/autoload_classmap.php,确认你要用的类名确实在数组里
为什么 vendor/autoload.php 不报错但运行时报 Class not found
常见于本地开发没开 classmap-authoritative,但线上 CI/CD 自动加了,或部署脚本用了 composer install --optimize-autoloader --classmap-authoritative。
- 错误现象:
vendor/autoload.php可正常 require,但调用某个类时才爆Class not found - 原因:那个类只在
psr-4下能加载,但没被扫进 classmap(比如它在tests/里,而dump-autoload -a没包含 tests 目录) - 验证方法:临时关掉
classmap-authoritative,再跑一次,如果类能加载,基本锁定是 classmap 漏掉了 - 修复不是关开关,而是补扫描路径:
composer dump-autoload -a --include-path tests/
strict 模式下容易被忽略的三个硬伤
所谓“严格”,其实是把 Composer 的容错能力全砍掉,暴露底层依赖真实状态。代价很实在:
-
require-dev的类默认不进 classmap,但测试代码又依赖它们——上线没问题,跑测试直接挂 - 动态拼接类名(
new $className)且$className不在 classmap 中,运行期必死,IDE 和静态分析都难发现 - 某些包(如 Laravel 的 Facades)靠运行时代理加载,一旦没进 classmap,
App::make()或门面调用全失效,错误信息还特别模糊
classmap-authoritative 不是银弹,它是把“加载慢”换成“加载脆”。真要上,得先扫清所有动态加载路径,再把 classmap 当成一份需要维护的契约清单。










