Composer 的 PHP 版本约束需在 require 中显式声明,如 "php": ">=7.2";config.platform.php 用于模拟部署环境,其值须满足 require.php 约束,否则报错;依赖版本锁定以 composer.lock 为准,不执行 update 不会自动升级。

Composer.json 中 PHP 版本约束的写法
Composer 不会自动检测你本地的 PHP 版本,它只在 composer install 或 composer update 时检查 platform 配置或当前运行环境是否满足 config.platform.php 或根级 require.php 的约束。你要控制依赖安装时的 PHP 兼容性,必须显式写进 require 字段。
常见错误是把版本号写成字符串(如 "php": ">=7.2")但漏掉点号,或误用波浪号(~7.2)——它等价于 ^7.2.0,只匹配补丁级更新,不适用于 PHP 主版本约束。
-
">=7.2"✅ 匹配 7.2.0 及以上所有版本(含 8.0、8.1…) -
"^7.2"✅ 等价于">=7.2.0 ,推荐用于明确限定主次版本范围 -
"~7.2"⚠️ 实际等价于">=7.2.0 ,太窄,一般不用作 PHP 约束 ">=7.2 ✅ 最清晰的区间写法,语义明确-
"7.2.*"❌ 不合法,Composer 不支持通配符语法
如何让 Composer 忽略本地 PHP 版本强制使用平台配置
当你在 PHP 8.2 环境下想测试包是否兼容 PHP 7.4,不能靠改系统 PHP,而应通过 config.platform.php 告诉 Composer:“假装我只装了 7.4”。否则 composer install 可能拉取仅兼容 8.x 的依赖版本。
这个配置会影响所有依赖的版本选择逻辑,不只是你自己的代码。
立即学习“PHP免费学习笔记(深入)”;
{
"require": {
"php": ">=7.4"
},
"config": {
"platform": {
"php": "7.4.33"
}
}
}
注意:config.platform.php 的值必须满足 require.php 的约束,否则会报错 Your requirements could not be resolved。
多 PHP 版本兼容时 require-dev 的陷阱
开发依赖(如 phpunit/phpunit)经常有更激进的 PHP 要求。如果你的项目要支持 PHP 7.2–8.2,但 phpunit:^9 要求 php: >=7.3,而 phpunit:^10 要求 php: >=8.1,就不能只写一个 require-dev。
解决方法不是降级 PHPUnit,而是用 config.platform.php 锁定构建环境,并在 CI 中分版本测试。
- CI 脚本中先设
COMPOSER_PLATFORM_CHECK=0防止本地 PHP 干扰 - 每个 PHP 版本跑一次
composer install --no-interaction - 不要在
require-dev里写"phpunit/phpunit": "^9 || ^10"—— Composer 不支持 OR 逻辑
为什么 composer show -p 显示的 PHP 版本和 php -v 不一致
composer show -p 显示的是 config.platform.php 值(如果设置了),否则才是当前运行 PHP 的版本。这是 Composer 模拟目标部署环境的方式,不是 bug。
如果你没设 platform.php,但输出仍是旧版本,大概率是 Composer 缓存了旧的 lock 文件或平台信息。执行 composer clear-cache 后重试,或删掉 composer.lock 再 composer install。
真正容易被忽略的是:即使 composer.json 里写了 "php": ">=8.0",只要没运行 composer update,lock 文件里仍可能保留 PHP 7.x 兼容的老版本依赖 —— 约束只在解析依赖图时起作用,不自动刷新已锁死的版本。











