config.platform.php 是告诉 Composer“假装当前 PHP 版本是X”,仅影响依赖解析;require.php 才是硬性运行门槛,两者不可混淆,必须协同配置确保多环境一致性。

composer.json 里用 config.platform.php 强制指定 PHP 版本
这不是“声明项目需要什么 PHP 版本”,而是告诉 Composer:“请假装当前运行环境是这个 PHP 版本”。它影响依赖解析时的版本约束判断,尤其在 CI 或低版本 PHP 机器上构建高版本依赖时很关键。
常见错误是把 platform 写成顶层字段,或误以为它能绕过本地 PHP 版本检查——它只影响依赖选择,不改变实际运行环境。
-
config.platform.php的值必须是字符串,如"8.1"或"8.2.10",不能写8.1(数字会被忽略) - 该配置不会覆盖
require.php的约束,但会优先用于判断哪些包版本可被安装 - 若本地 PHP 是 8.0,但设了
"php": "8.2",Composer 仍可能装入含match表达式或#[\Attribute]的包——运行时直接报错
require.php 是真正的最低运行版本门槛
这才是项目启动前必须满足的硬性条件。Composer install/update 时会校验当前 PHP 版本是否 ≥ 此值,不满足就中断并报错:Your requirements could not be resolved to an installable set of packages.
它和 config.platform.php 是两回事:前者是“我要求你至少有 X”,后者是“我假装你有 X”。生产环境应以 require.php 为准。
立即学习“PHP免费学习笔记(深入)”;
- 格式必须为版本约束字符串,如
">=8.1.0"、"^8.2",不能写"8.1"(会被当作"^8.1.0",但语义不明确) - 建议显式写
">=8.1.0"而非"^8.1",避免因 minor 版本策略变化导致意外升级失败 - 如果依赖的某个包要求
php: "^8.3",而你的require.php是">=8.1.0",Composer 仍会拒绝安装——因为无法满足子依赖的约束
如何验证配置是否生效
别只看 composer install 是否成功。要确认 Composer 真正按你预期做了版本决策,得查它的依赖解析逻辑。
最直接的方法是运行带详细输出的更新命令,并观察 PHP 版本参与决策的过程:
composer update --dry-run -vvv
输出中会包含类似这样的行:
Resolving dependencies through SATLooking at all rules.Something's changed, looking at all rules again (pass #1)Dependency resolution completed in 0.001 secondsPHP version required: >=8.1.0
如果看到 PHP version required 后面的值和你写的不一致,说明被其他依赖或平台配置覆盖了。
- 执行
composer show --platform可查看当前生效的 platform 值(包括php) - 执行
composer config --list | grep platform只显示配置项,不反映是否被继承或覆盖 - CI 中建议加一步:
php -v && composer show --platform | grep php,确保运行时 PHP 和 Composer 解析用的 PHP 版本一致
多环境协同时最容易漏掉的点
开发机是 PHP 8.3,CI 是 8.1,Docker 构建镜像用的是 8.2 —— 这种场景下,仅靠 require.php 不够,必须配合 config.platform.php 锁定构建行为。
否则 CI 可能装入一个只在 8.3 下测试过的 dev-dependency,而 Docker 构建时因 PHP 版本略低,又触发不同分支的依赖选择,最终线上行为不一致。
- 不要在
composer.json里写死config.platform.php后就不管了;把它视为构建脚本的一部分,和.php-version、Dockerfile中的FROM对齐 - 团队内应统一维护一份
php-compat.md,记录每个 major 版本对应的require.php和典型config.platform.php场景 - 升级 PHP 版本时,先改
require.php,再跑composer update,最后手动检查vendor/autoload.php是否仍能加载、是否有 fatal error











