require.php是唯一能拦截低版本安装的字段,必须写在composer.json的require下,合法写法如"^8.1"或">=8.1.0";config.platform.php仅影响依赖解析,需写完整版本号如"8.1.10",不参与运行时校验。

require.php 是唯一能拦住低版本安装的字段
必须把 php 写在 composer.json 的 require 里,其他位置都不起作用。写错地方(比如塞进 config 或 require-dev)会导致 composer install 在 PHP 8.0 环境下照常执行,直到上线跑出 Fatal error: Uncaught ParseError 才暴露问题。
合法写法只有这些:"php": "^8.1"、"php": ">=8.1.0"、"php": "~8.1.0"。以下写法会被 Composer 忽略或误判:
-
"php": "8.1"—— 被当作精确匹配,PHP 8.1.10 不满足 -
"php": "8.1.*"—— 语法不被识别,直接跳过校验 -
"php": "^8.1.0"—— Composer 不支持补零写法,解析失败
如果项目已存在 composer.lock,且它是在高版本 PHP 下生成的,composer install 会跳过 PHP 版本检查,直接按锁文件装包。这时得先删锁文件,再跑 composer update --dry-run 观察是否报错。
config.platform.php 不是“设最低版”,而是“假装你有某版本”
config.platform.php 的值只影响依赖解析逻辑,比如你在 PHP 8.2 开发机上想确保装出来的包能在 PHP 8.1 服务器上跑,就得设 "platform": {"php": "8.1.10"}。它不会阻止你用 PHP 8.2 运行 composer install,也不会让项目突然兼容 PHP 8.0。
这个字段必须写完整版本号,如 "8.1.10" 或 "8.0.30"。"^8.1" 或 "8.1" 会被忽略,Composer 日志里可能连 warning 都不打。
常见翻车点:
- CI 脚本里只配了
config.platform.php,没配require.php,构建通过但上线就崩 - 本地开发时设了
"platform": {"php": "7.4"},结果代码用了str_contains()(PHP 8.1+),运行时报错 - 误以为设了
platform.php就能绕过本地 PHP 版本限制,其实它对composer install的环境校验毫无影响
验证 PHP 约束是否真生效,不能只看 install 成不成功
光跑通 composer install 不代表约束生效。要确认三点:
- 在低于声明版本的环境(如声明
"^8.1",却用 PHP 8.0 执行)下运行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,输出应为php: 8.1.0(来自config.platform.php),而非系统真实版本 - 打开
composer.lock,检查"platform": {"php": "8.1.10"}字段是否与config.platform.php一致,且不是空或默认值
CI 中建议加一步:执行 php -l vendor/autoload.php。如果语法报错,说明即使依赖装上了,PHP 版本也不匹配——这比纯依赖声明更贴近真实运行态。
create-project 时临时卡 PHP 版本,得用 --platform 参数
用 composer create-project 拉一个没写 require.php 的旧项目,又想提前卡住 PHP 版本,不能靠改全局配置。正确做法是:
composer create-project foo/bar myproj --platform=php:8.2 --no-interaction
这个 --platform=php:8.2 会临时覆盖目标项目的 config.platform.php,并参与本次依赖解析。但它不会自动写入新项目的 composer.json,后续仍需手动补上 "require": {"php": "^8.2"}。
别用 COMPOSER_IGNORE_PLATFORM_REQS=1 或 --ignore-platform-reqs 来“绕过问题”,这只是掩盖风险,不是解决兼容性。
最易被忽略的是:即使 require.php 和 config.platform.php 都配对了,如果代码里用了 #[\Attribute](PHP 8.0+)或 enum(PHP 8.1+),而静态分析工具没接入,运行时照样崩——版本约束管不了语法,只管依赖选择和基础环境门槛。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











