composer dump-autoload 不提供导出类名功能,仅生成 vendor/autoload.php 和 autoload_classmap.php;后者是权威映射源,需用 php -r "$map = include '...'; echo implode(\n, array_keys($map));" 提取类名。

composer dump-autoload 为什么不能直接导出类名列表
因为 dump-autoload 的职责只是生成或刷新 vendor/autoload.php 和相关映射文件(比如 vendor/composer/autoload_classmap.php),它本身不提供“输出类名”这个能力。你看到的类映射表是给 Composer 自己用的,不是为人类可读设计的。
真正能拿到全部类名的地方,其实是生成后的 autoload_classmap.php 文件——但它是个 PHP 数组,键是类名,值是文件路径,需要提取。
- 直接读这个文件最可靠,因为它是 Composer 实际加载时依据的权威映射
- 别依赖
composer show --all或扫描src/目录,那些会漏掉 PSR-4 动态映射、匿名类、或被排除在 autoload 配置外但实际存在的类 - 注意:如果项目用了 classmap 类型的自动加载(比如
"classmap": ["legacy/"]),这些类也会出现在该文件中,必须包含
怎么从 autoload_classmap.php 提取所有类名
最轻量、无额外依赖的做法是写一行 PHP 命令,直接解析并输出类名:
php -r "\$map = include 'vendor/composer/autoload_classmap.php'; echo implode(\n, array_keys(\$map));"
这条命令做了三件事:载入映射数组、取所有键(即类名)、换行拼接输出。它不依赖外部工具,也不需要改项目代码。
- 确保先运行过
composer dump-autoload,否则autoload_classmap.php可能不存在或过期 - 如果项目没启用 classmap 或未配置 PSR-4/PSR-0,
autoload_classmap.php可能为空——这时得结合composer config autoload看实际配置类型 - 输出结果不含命名空间分隔符
\的转义问题,因为 PHP 数组键本身就是原样字符串
用 composer install --no-autoloader 会破坏类名提取吗
会。这个参数跳过生成所有 autoload 文件,包括 autoload_classmap.php。如果你依赖这个文件提取类名,执行完 composer install --no-autoloader 后再跑上面的 PHP 命令,会报错:Warning: include(): Failed opening 'vendor/composer/autoload_classmap.php'。
- CI/CD 中常见误操作:为了加速构建跳过 autoloader,结果后续步骤(如生成文档、校验类存在性)失败
- 替代方案:用
composer install --no-scripts --no-plugins保留 autoload,只禁用可能耗时的脚本和插件 - 若真不能生成 autoload(比如纯构建环境),只能退回到扫描源码目录 + 解析
composer.json中的autoload配置,但准确率下降明显
类名重复或大小写敏感问题怎么处理
PHP 类名在运行时是大小写不敏感的(Windows/macOS 默认文件系统也如此),但 Composer 的 classmap 键是严格按定义时的大小写存的。这意味着:你可能在映射表里看到 MyClass 和 myclass 同时存在(虽然实际只会加载一个)。
- 不要对类名做
strtolower()去重——这会导致无法区分FooBar和foobar这种刻意设计的差异 - 真实项目中应避免手动注册同名不同大小写的类;Composer 本身不会报错,但加载行为不可控
- 如果目标是生成唯一类名清单用于静态分析,建议加一层过滤:只保留符合 PSR-4 命名规范(首字母大写、驼峰)的类名,忽略全小写或下划线风格的旧类










