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 - 支持所有 SemVer 兼容写法:
"~8.1.0"、">=8.0.0 、"8.1.*"等,但推荐用^(更符合语义) - 该字段只影响依赖解析和安装阶段;若本地 PHP 版本不满足,Composer 会明确报错:
Your requirements could not be resolved to an installable set of packages.并提示php不匹配
为什么 composer install 有时不报错?
常见于以下情况,导致 PHP 版本限制“失效”:
立即学习“PHP免费学习笔记(深入)”;
- 项目已存在
composer.lock,且其中记录的依赖版本是在旧 PHP 下解析成功的 —— 此时composer install会跳过版本重解析,直接按 lock 文件安装,不校验php要求 - 运行
composer install的 PHP 版本恰好满足composer.json要求,但实际运行时代码用了更高版本特性(比如 8.2 的readonly class),而 Composer 不管运行时行为 - CI/CD 环境中用了
--ignore-platform-reqs或COMPOSER_IGNORE_PLATFORM_REQS=1,这会彻底跳过所有平台约束(包括php、ext-xxx)
强制校验 PHP 版本:用 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 版本下做完整验证
容易忽略的关键点
很多人以为写了 "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 依赖











