推荐使用 Composer\InstalledVersions 类获取包版本(PHP 8.0+/Composer 2.2+),其次可读取 vendor/composer/installed.json,或用 composer show 命令行调试。

可以直接读取 Composer 生成的 vendor/composer/installed.json 文件,或者使用 Composer 的 InstalledVersions 运行时类(推荐,更安全、更轻量)。
使用 InstalledVersions 类(PHP 8.0+ 推荐方式)
Composer 2.2+ 自动在 vendor/autoload.php 中注册了 Composer\InstalledVersions 类。只要已引入 autoload,就能直接调用静态方法获取版本信息。
- 确保已执行
composer install或composer update,且项目已加载vendor/autoload.php - 检查目标包是否确实安装(比如
monolog/monolog) - 代码示例:
require_once 'vendor/autoload.php';
use Composer\InstalledVersions;
// 获取指定包的版本(返回字符串,如 "2.10.0")
if (InstalledVersions::isInstalled('monolog/monolog')) {
$version = InstalledVersions::getVersion('monolog/monolog');
echo "Monolog version: " . $version;
}
// 获取所有已安装包及其版本(返回关联数组)
$packages = InstalledVersions::getInstalledPackages();
foreach ($packages as $package) {
if (InstalledVersions::isInstalled($package)) {
echo "$package => " . InstalledVersions::getVersion($package) . "\n";
}
}
读取 installed.json 文件(兼容旧版 Composer)
适用于无法使用 InstalledVersions 的场景(如 Composer 1.x 或未启用该类),但需注意文件路径和 JSON 解析异常处理。
- 路径固定为
vendor/composer/installed.json(Composer 1 和 2 均支持) - 文件内容是 JSON 格式,包含每个包的
name、version、dist等字段 - 示例代码:
$installedJson = file_get_contents('vendor/composer/installed.json');
$installed = json_decode($installedJson, true);
foreach ($installed as $pkg) {
if ($pkg['name'] === 'monolog/monolog') {
echo "Monolog version: " . $pkg['version'];
break;
}
}
通过命令行快速查看(开发调试用)
不写 PHP 代码也能快速确认:在项目根目录运行以下命令。
立即学习“PHP免费学习笔记(深入)”;
-
composer show monolog/monolog—— 显示详细信息(含版本、描述、依赖等) -
composer show --format=json monolog/monolog—— 输出 JSON 格式,适合脚本解析 -
composer list --installed—— 列出所有已安装包及版本简表
注意事项与常见问题
避免踩坑的关键点:
-
不要硬编码 vendor 路径:用
__DIR__ . '/vendor/composer/installed.json'或基于getcwd()更可靠 - InstalledVersions 不支持 Composer 1.x 全版本:Composer 1.10+ 才开始实验性提供,生产环境建议升级到 Composer 2+
-
版本号可能带后缀:如
dev-main、2.10.x-dev,取决于安装方式(tag vs branch) -
私有包或 path repo 同样适用:只要被 Composer 记录在
installed.json或InstalledVersions中即可查到
基本上就这些。用 InstalledVersions 是最现代、最稳定的方式;临时调试可配合命令行;老项目读 JSON 文件也完全可行。











