在 PHP 项目里,Composer 往往是最先接触、也最容易“会用但没真正理解”的工具。本文从安装一个日志库开始,按项目文件、自动加载和常用命令三部分拆开说明,帮助你判断每个文件该不该改、什么时候该用 install、什么时候该用 update。
先从一个依赖安装示例开始
如果项目需要引入日志库 monolog/monolog,最直接的做法就是在项目目录执行下面这条命令:
composer require monolog/monolog
执行完成后,Composer 会在项目里生成或更新 composer.json。这个文件的核心作用,是描述当前项目依赖了哪些库、依赖版本约束是什么,同时也可以保存项目的一些元数据。像 Laravel、Yii 这类主流 PHP 框架项目,通常都会自带这个文件。
对日常开发来说,可以把这一步理解为:你不是手动下载第三方包放进项目,而是把依赖关系交给 Composer 统一管理。
Composer 相关文件各自负责什么
一个启用了 Composer 的 PHP 项目里,最关键的通常是下面三个目录或文件:

vendor
composer.json
composer.lock
vendor:第三方依赖的实际存放位置
vendor 目录里放的是已经安装到本地项目中的依赖库,也就是项目所有第三方代码的默认位置。这个目录通常不建议手动修改,因为每次执行依赖安装或更新时,里面的内容都可能被重新覆盖。

composer.json:项目依赖关系的声明文件
composer.json 记录的是项目需要哪些依赖、版本要求是什么,以及其他与 Composer 相关的配置数据。可以把它看成“项目希望安装什么”的声明。
composer.lock:把实际安装版本锁定下来
当依赖安装完成后,Composer 会把当次解析出的确切版本写入 composer.lock。这个文件的意义非常直接:它能锁定项目使用的具体依赖版本,避免不同开发者、不同环境拉到不一致的包。
这也是多人协作里非常重要的一点。提交 composer.lock 后,团队成员在开发环境执行安装时,通常就能拿到相同版本的依赖;部署到生产环境时,也更容易保持与开发环境一致。
原文这里特别提到,在执行 composer install package_name 命令时会优先检查锁文件是否存在;如果存在,就按锁文件中的指定版本安装,而不是重新依据 composer.json 做一次版本解析。对于理解 Composer 的使用习惯来说,重点就在于:lock 文件存在时,安装结果会更稳定、更可重复。
安装后怎么在项目里直接使用库
Composer 不只是管理依赖下载,还会帮项目生成自动加载能力。安装依赖后,你会得到一个 vendor/autoload.php 文件,项目只要引入它,就能直接使用这些库提供的类,而不需要自己逐个 require 对应文件。
例如在项目中创建一个 index.php:
<?php
require __DIR__ . '/vendor/autoload.php';
$log = new MonologLogger('name');
$log->pushHandler(new MonologHandlerStreamHandler('logs/app.log', MonologLogger::DEBUG));
$log->info('Foo');
然后执行:
php index.php
运行后,这段代码会把日志写入 logs/app.log。这个例子展示的核心不是日志本身,而是 Composer 的自动加载机制已经接管了第三方类的引入流程。也就是说,只要依赖已正确安装,并且入口文件加载了 vendor/autoload.php,后续使用库时就不必再手动处理类文件路径。
几条最常用的 Composer 命令
composer install
composer install
这条命令会读取当前目录下的 composer.json,解析依赖并安装到 vendor 目录中。
如果项目中已经存在 composer.lock,那么 Composer 会直接按照锁文件中的确切版本安装依赖,这样不同开发者拿到的依赖版本会保持一致;如果没有锁文件,Composer 会先解析依赖,再生成对应的 composer.lock。
composer update
composer update
这条命令会根据 composer.json 中定义的依赖要求,重新获取符合条件的较新版本,并把最终解析出的确切版本写回 composer.lock。如果你想刷新项目依赖,而不是严格按现有锁文件安装,就会用到它。
composer require vendor/package
composer require vendor/package
用于安装指定包,并把它写入 composer.json。如果当前项目还没有这个文件,Composer 也会即时创建。
composer remove vendor/package
composer remove vendor/package
用于移除指定的软件包,同时更新项目中的依赖声明。
composer self-update
composer self-update
这条命令更新的是 Composer 工具本身,而不是项目依赖。也就是说,它解决的是“包管理器版本是否最新”的问题,不是“项目用了哪些第三方库”的问题。
实际使用时最值得记住的几件事
如果只保留最关键的认知,可以记住这几条:
composer require monolog/monolog这类命令用于把新依赖加入项目。composer.json说明项目需要什么依赖。composer.lock记录项目实际安装了哪些具体版本,适合保证团队环境一致。vendor是第三方代码目录,通常不要手工改动。- 项目代码要使用已安装库时,先加载
vendor/autoload.php。
把这些基础关系理顺之后,再看 Composer 的其他高级功能就会容易很多,因为它的核心逻辑始终没有变:声明依赖、安装依赖、锁定版本、自动加载。









