项目必须在 composer.json 的 require 字段中声明 php 版本(如 "php": "^8.1"),这是强制性环境契约,用于约束依赖解析、防止兼容问题;config.platform.php 仅用于模拟环境,不替代 require.php 的校验作用。

项目必须明确声明最低 PHP 版本,否则 composer install 或 composer update 可能在不兼容的环境中静默失败,或导致运行时 fatal error —— 这不是可选配置,而是强制性环境契约。
在 composer.json 中设置 php 平台版本约束
Composer 通过 "platform" 配置(或更常用、更直接的 "config.platform.php")来覆盖当前系统 PHP 版本,但真正起约束作用的是 "require" 下对 php 的声明。这是唯一被 composer validate 和依赖解析器实际校验的字段。
-
"require": { "php": "^8.1" }表示项目仅支持 PHP 8.1 及以上(但低于 9.0),Composer 会拒绝在 PHP 8.0 环境中安装 - 若同时使用
"config": { "platform": { "php": "8.0.0" } },它只影响当前机器上“假装”用 PHP 8.0 解析依赖,**不改变项目本身要求**;它常用于 CI 中锁定构建环境 PHP 版本,但不能替代require.php - 错误写法:
"require": { "php": ">=8.1" }—— 虽然语法合法,但缺少语义精度,无法触发 Composer 对主版本升级(如 9.0)的自动拦截,推荐用^8.1或~8.1.0
为什么 composer.json 中的 php 声明会影响依赖解析
Composer 不仅检查你本地 PHP 版本,还会根据 require.php 向 Packagist 查询「该 PHP 版本下可用的包版本」。例如:某组件的 v3.0 标明只支持 php: ^8.2,而你声明了 "php": "^8.1",那么 v3.0 就不会进入候选列表,即使你本地是 PHP 8.2 —— 因为你的项目“承诺”的兼容范围太宽,Composer 必须保证所有声明版本都安全。
- 依赖包的
composer.json里也有自己的require.php,Composer 会做交集计算 - 若你漏写
php,Composer 默认按当前执行环境 PHP 版本推断,这会导致不同机器上composer.lock不一致 - CI 环境中未声明
php是最常见导致「本地能装、CI 报错」的原因
验证是否生效:三步快速检查
改完 composer.json 后,别只信自己眼睛,用工具确认。
立即学习“PHP免费学习笔记(深入)”;
- 运行
composer validate—— 它会提示require.php是否缺失或格式错误 - 临时降级本地 PHP(如用
phpbrew use 8.0),再执行composer install,应看到类似错误:Your requirements could not be resolved to an installable set of packages... php[8.0] is not supported. - 查看生成的
composer.lock,搜索"platform": {"php"字段,确认其值与require.php一致(不是你系统当前版本)
{
"name": "my/app",
"type": "project",
"require": {
"php": "^8.1",
"monolog/monolog": "^2.10"
},
"config": {
"platform": {
"php": "8.1.0"
}
}
}
很多人以为写了 "config.platform.php" 就够了,其实它只是调试辅助;真正让团队、CI、协作方清楚边界的是 require.php —— 这个字段一旦设错,修复成本远高于初期多敲几个字符。











