Composer是现代PHP工程化的基础设施事实标准,其composer.json定义项目跨环境精确运行的全部依赖契约,vendor/autoload.php为所有入口文件必需首行加载项,composer.lock保障部署可复现性。

Composer 不是某种“开发趋势”,它是现代 PHP 项目工程化的基础设施事实标准——就像 npm 之于 Node.js,pip 之于 Python。它早已越过“趋势”阶段,成为不可绕过的生产必需。
composer.json 是项目契约,不是配置文件
- 它定义的不是“我想装什么”,而是“这个项目在任何环境里必须精确运行所依赖的全部条件”
-
require字段声明的是生产环境强依赖(如monolog/monolog、guzzlehttp/guzzle),漏写会导致线上 fatal error -
require-dev是开发期工具链(如phpunit/phpunit、phpstan/phpstan),上线前必须用composer install --no-dev剥离 - 错误做法:把框架核心(如
laravel/framework)硬塞进一个原生 PHP 网站的require,结果路由、容器、中间件全没初始化,类存在却无法实例化
vendor/autoload.php 加载失败 = 项目启动失败
- 所有现代 PHP 入口文件(
index.php、api.php、CLI 脚本)第一行必须是:require __DIR__ . '/vendor/autoload.php';
- 没这句,
new \GuzzleHttp\Client()或new App\Services\PaymentService()都会报Class not found - 常见坑:
- 项目根目录不对,
vendor/实际在上级目录,路径拼错 - 使用了 symlink 或 Docker volume 挂载,但
vendor/目录未被挂载或权限受限 - 在 CLI 下执行脚本时,当前工作目录不是项目根,
<strong>DIR</strong>指向错误位置
- 项目根目录不对,
composer.lock 决定部署是否可复现
-
composer install读取composer.lock,安装完全确定的版本组合(含子依赖) -
composer update忽略composer.lock,按composer.json中的约束(如^2.0)拉取最新兼容版——这行为只允许发生在本地开发机 - 线上服务器一旦执行
composer update,就等于主动放弃环境一致性保障;某天doctrine/dbal小版本升级后修改了 SQL 生成逻辑,订单查询突然返回空数组,问题极难回溯 - 正确流程:本地
update→ 提交更新后的composer.lock→ 线上仅install
composer dump-autoload 这个命令常被忽略,但它才是连接你自己的代码和自动加载系统的最后一环。改了 autoload 配置、新增了 src/ 下的类、调整了命名空间映射,不运行它,新类就永远“看不见”。它不下载包,也不改依赖,但它让整个自动加载规则真正生效——这点,在迁移老项目时最容易卡住。



















