Composer 自动生成的 autoload 文件是严格按规则硬编码的静态映射,不可手动修改或纳入版本控制;真正负责类加载的是 autoload_psr4.php 等映射文件,由 dump-autoload 扫描源码生成,路径拼接敏感且依赖 installed.json 快照。

Composer 自动生成的文件不是“配置生效后顺手写几个PHP文件”那么简单,而是严格按规则硬编码生成的一组静态映射文件,删一个就 Class not found。
vendor/autoload.php 只是入口,不是逻辑主体
它只做三件事:引入 autoload_real.php、调用 getLoader()、返回已注册的加载器实例。它不扫描代码、不读 composer.json 运行时配置、也不包含任何命名空间映射。
- 手动改它没用——下次
composer install或composer dump-autoload会直接覆盖 - 复制别人项目的
vendor/autoload.php到自己项目,大概率报错,因为里面引用的autoload_psr4.php路径是相对生成环境硬写的 - 它不决定类在哪——真正干活的是
vendor/composer/autoload_psr4.php和autoload_classmap.php
autoload_psr4.php 等映射文件是硬编码数组,不是运行时计算
比如你配置了 "App\": "src/",Composer 就会生成类似这样的内容:
return array(
'App\' => array($baseDir . '/src/'),
);
这个数组是 composer dump-autoload 扫描源码后一次性生成的,过程如下:
- 读取
composer.json中的autoload.psr-4配置 - 递归扫描
src/下所有.php文件(跳过vendor/) - 对每个文件用正则提取
namespace声明(不 require、不语法检查、不验证类名是否匹配文件名) - 判断 namespace 是否以配置前缀开头,是就记录映射关系
- 最终写成静态 PHP 数组,存为
autoload_psr4.php
路径拼接完全靠字符串替换:AppControllerUserController → 去前缀 → Controller/UserController → 拼 src/ → src/Controller/UserController.php。反斜杠数量、大小写、末尾斜杠,错一个就找不到文件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
installed.json 是状态快照,不是配置文件
vendor/composer/installed.json 是 Composer 维护的 vendor 目录快照,记录每个包的名称、版本、路径、autoload 配置和依赖关系。
- 它不参与代码执行,但所有自动加载映射都基于它合并生成
- 删掉它再跑
composer install会重建,但中间阶段必然 Class not found - 它不等于
composer.lock:lock是声明“该装什么”,installed.json是记录“现在装了什么” - IDE 补全、PHPStan 类型分析、插件等都依赖它——改名或移走
vendor目录会导致这些工具失效
vendor/bin 下的可执行文件来自依赖包的 bin 字段
像 php-cs-fixer、laravel/installer 这类工具,是在它们自己的 composer.json 中声明了 bin 字段:
"bin": ["bin/php-cs-fixer"]
Composer 安装时会处理这个字段:
- Linux/macOS 上通常建符号链接指向原始包中的脚本
- 某些 Windows 环境下会复制文件
- 所有生成的二进制文件开头都有
#!/usr/bin/env php,且被包装了一层自动加载环境,确保能用项目里的依赖
这些文件不是你写的,也不是 Composer “编译”出来的,而是依赖包自带、由 Composer 自动暴露到 vendor/bin/ 的入口。
最常被忽略的点是:所有自动生成文件(autoload_*.php、installed.json、autoload.php)都不可手动编辑,也不应纳入版本控制的例外规则里——它们是状态文件,不是配置文件。改了 composer.json 就必须重跑命令,否则映射和实际代码永远对不上。

















