
Composer 不强制检查 PHP 版本,但通过 composer.json 的 "php" 字段可触发校验;在 require 中声明如 "php": "^8.1" 表示支持 8.1.0 及以上、低于 9.0 的版本。
Composer 本身不强制执行 PHP 版本检查,但 composer.json 中的 "php" 字段能被 composer install 和 composer update 主动校验——前提是项目启用了 config.platform.php 或你本地环境未满足该要求时 Composer 会报错并中止操作。
composer.json 中声明 PHP 版本要求直接在 require 段写入 "php" 条目即可,这是最常用、最有效的限制方式:
{
"require": {
"php": "^8.1",
"monolog/monolog": "^2.8"
}
}
说明:
"php": "^8.1" 表示允许 PHP 8.1.x、8.2.x、8.3.x(但不包括 9.0+),等价于 >=8.1.0
"~8.1.0"、">=8.0.0 、"8.1.*" 等,但推荐用 ^(更符合语义)
Your requirements could not be resolved to an installable set of packages. 并提示 php 不匹配composer install 有时不报错?常见于以下情况,导致 PHP 版本限制“失效”:
composer.lock,且其中记录的依赖版本是在旧 PHP 下解析成功的 —— 此时 composer install 会跳过版本重解析,直接按 lock 文件安装,不校验 php 要求composer install 的 PHP 版本恰好满足 composer.json 要求,但实际运行时代码用了更高版本特性(比如 8.2 的 readonly class),而 Composer 不管运行时行为--ignore-platform-reqs 或 COMPOSER_IGNORE_PLATFORM_REQS=1,这会彻底跳过所有平台约束(包括 php、ext-xxx)
platform 配置模拟目标环境当你需要在高版本 PHP 开发机上,模拟低版本环境(如测试是否兼容 PHP 8.0),应使用 config.platform.php:
{
"require": {
"php": "^8.0"
},
"config": {
"platform": {
"php": "8.0.30"
}
}
}
说明:
config.platform.php 会覆盖当前运行 Composer 的真实 PHP 版本,让依赖解析器“以为”你只在 PHP 8.0.30 下工作ext-gd、ext-mbstring)的解析,不只是 php
很多人以为写了 "php": "^8.1" 就万事大吉,但实际出问题往往卡在这几个地方:
composer.lock 是权威依据 —— 它一旦生成,install 就不再读 composer.json 的 php 字段;改了 PHP 要求后,必须运行 composer update --lock 或删 lock 重生成platform 配置只在 update 或首次 install 时生效;如果 lock 文件里已有不兼容包(比如某个包的 3.x 版本要求 PHP 8.2,而你设了 platform.php = "8.1"),Composer 会拒绝更新并报错require-dev 里声明了宽松的 PHP 要求(如 "php": "*"),可能绕过主 require 的限制,建议统一检查 dev 依赖