必须同时配置require.php(如"^8.1")、config.platform.php(完整小版本如"8.1.27")并执行composer update --lock刷新锁文件,三者缺一不可;仅设platform无法阻止运行时崩溃。

想让 Composer 安装的依赖只兼容某个 PHP 主版本(比如只跑在 8.x,不进 9.0),不能靠 config.platform.php 单独搞定——它只是“假装环境”,不拦运行时崩溃;真正起效的是 require.php 声明 + platform 配合 + 锁文件刷新这三步闭环。
require.php 必须写对,否则 platform 白配
很多人只改 config.platform.php,结果 composer install 还是装出 PHP 9.0 兼容包,上线直接 ParseError: syntax error, unexpected token "enum"。根本原因是没在 require 段声明项目真实依赖的 PHP 能力边界。
-
"php": "^8.1"是正确写法:表示“我代码用了 PHP 8.1+ 的特性(如match、str_contains),请别给我装低于 8.1 的旧版包,也别让我意外兼容 9.0” -
"php": "8.*"或"php": ">=8.0.0"是错的:前者被 Composer 当作模糊通配忽略,后者虽能解析但不阻止 9.0 包混入(因 9.0 ≥ 8.0.0) - 这个字段会触发
composer install时校验php -v,不匹配就报错退出,不是警告
platform.php 要写完整小版本号,且必须更新锁文件
config.platform.php 的作用是让 Composer 在解析依赖时“降级思考”——比如你本地是 PHP 8.2,但项目要部署到 PHP 8.1 环境,就得让它按 8.1 去挑包,否则可能装到只标了 php: ^8.2 的新包。
- 必须写成带补丁号的完整版本,例如
"7.4.33"或"8.1.27";"8.1"或"^8.1"会被直接忽略 - 改完后不执行
composer update --lock,composer.lock里还是按原来平台解析的老版本,install时完全不生效 - 验证是否生效:运行
composer show php,输出应为 platform 设置的值,而非php -v结果
为什么锁文件比 composer.json 更关键?
composer.json 是意向,composer.lock 才是执行契约。即使你写了 "php": "^8.1" 且 platform 配得滴水不漏,只要 composer.lock 里存的是上次用 PHP 9.0 解析出来的包,composer install 就照装不误。
立即学习“PHP免费学习笔记(深入)”;
- 删掉
vendor/和composer.lock,再跑composer install,才能彻底重走一遍平台约束流程 - CI/CD 中务必用
composer install(不是update),且确保composer.lock已提交到 Git - 检查
composer.lock是否真锁定:打开它,找对应包的version字段,必须是精确字符串(如"8.1.27"),不能是"^8.1"或空
最常被忽略的点是:以为配了 platform 就万事大吉,却没动 require.php,也没刷锁文件。结果本地开发没问题,一上测试机就崩——因为那台机器 PHP 版本低,而 lock 文件里记的包根本没考虑它。



















