必须在 require 中写 "php": "^8.1",这是唯一触发安装时硬性校验的位置;config.platform.php 仅模拟环境用于依赖解析,不构成运行门槛,且需完整版本号如 "8.0.30" 才生效。

必须在 require 下写 "php": ">=8.1.0",否则 Composer 不会校验最低版本;只靠 config.platform.php 是“假装环境”,不构成运行门槛。
composer.json 里哪里写 PHP 最低版本?
写在 require 字段里,不是 config,也不是 require-dev。这是唯一能触发安装时硬性校验的位置。
-
"php": "^8.1"表示 ≥ 8.1.0 且 "php": ">=8.1.0",避免 minor 版本策略变动导致解析异常 - 如果漏写这一项,Composer 默认按当前
php -v推断,不同机器上composer.lock可能不一致 - 写成
"php": "8.1.*"或"php": "8.1"会被忽略——Composer 不识别这种模糊写法 - 错误现象:
composer install在 PHP 8.0 环境下仍成功执行,说明require.php没生效,大概率是字段位置错了或语法不合法
为什么 config.platform.php 不能替代 require.php?
config.platform.php 的作用是让 Composer “假装”运行在某个 PHP 版本下做依赖解析,但它不改变项目实际需要的最低运行版本。
- 例如本地是 PHP 8.2,但设了
"config": { "platform": { "php": "8.0.30" } },Composer 就只选 8.0 兼容的包,可项目代码若用了str_contains()(8.1+),运行时仍 fatal error -
config.platform.php必须写完整版本号,如"8.0.30",写"^8.0"或"8.0"会被直接忽略 - 它只影响
composer update时的依赖求解逻辑,不影响composer install对当前环境的校验 - 常见误用:CI 中只配了
platform.php却没配require.php,结果构建通过、上线报错
如何验证 PHP 版本约束是否真正生效?
别只看 composer install 是否成功,要确认两件事:当前环境是否被拒绝、锁文件是否反映目标平台。
立即学习“PHP免费学习笔记(深入)”;
- 在低于声明版本的 PHP 下执行
composer install,应看到类似错误:Your requirements could not be resolved to an installable set of packages... The requested PHP version is >=8.1.0, but your system has 8.0.30. - 运行
composer show --platform查看当前生效的 platform 值(显示的是config.platform.php,不是系统版本) - 检查
composer.lock文件里的"platform": {"php": "..."}字段,它的值应与config.platform.php一致,且不能是空或系统默认值 - CI 脚本中记得加
--no-interaction --prefer-dist --no-progress,避免因交互或进度条干扰平台判断
最容易被忽略的一点:修改 require.php 后,必须手动运行 composer update --lock 才能让 composer.lock 重新按新约束解析;否则旧 lock 文件仍按老规则锁定依赖,上线后可能因子依赖要求更高 PHP 版本而崩溃。



















