php 字段是硬性版本约束,应写在 require 中而非 config.platform.php;^8.1 表示兼容 8.1.x 但不升级到 8.2.0,等价于 >=8.1.0

composer.json 里写 php 字段就能约束版本
Composer 会读取 composer.json 中的 config.platform.php 或根级 require.php 来决定项目允许的 PHP 版本范围,前者用于模拟平台环境(比如 CI),后者才是真正的依赖约束依据。
直接在 require 下加一行即可:
{
"require": {
"php": "^8.1"
}
}
这行不是建议,是硬性要求:安装时若本地 PHP 不满足,composer install 会直接报错,提示类似 Your requirements could not be resolved to an installable set of packages.
-
require.php是项目级约束,影响所有依赖解析,必须写 - 别用
config.platform.php替代它——那只是让 Composer “假装”运行在某个 PHP 版本下,不阻止你在 PHP 7.4 上跑一个标称要 PHP 8.1 的项目 - 如果同时写了
require.php和config.platform.php,后者只影响扩展/扩展类库的平台包选择,不影响 PHP 本身版本校验
为什么 ^8.1 比 >=8.1.0 更常用
因为 ^ 符号在 Composer(底层用的 composer/semver)中对主版本为非零的数字默认启用“向后兼容更新”,即 ^8.1 等价于 >=8.1.0 ,能安全接受 <code>8.1.x、8.2.x 直到 8.9.x 的补丁和次版本升级。
立即学习“PHP免费学习笔记(深入)”;
- 写死
"php": "8.1"会导致8.1.10被拒绝,实际没必要 - 用
~8.1(波浪号)则只允许8.1.x,不升级到8.2,适合强锁定次版本的场景 - 如果项目真依赖 PHP 8.2+ 的特性(比如只读属性),就该写
^8.2,别为了“兼容旧环境”降级约束
CI/CD 中常见失效:PHP 版本没生效
很多 CI 脚本里先装依赖再检查 PHP 版本,结果 composer install 成功了,但运行时报 ParseError: syntax error, unexpected token——说明 require.php 没起作用。
- 检查是否误把
php写进了require-dev:它只约束 dev 依赖,不影响主环境校验 - 确认没有在
composer.lock提交前手动删过它;锁文件一旦存在,Composer 默认跳过版本重检,除非加--ignore-platform-req=php(这个参数就是用来绕过的,别在正式流程里用) - Docker 构建时若用了多阶段,确保
composer install运行在目标 PHP 版本的容器里,而不是构建机本地 PHP
团队协作时最易忽略的一点
require.php 只约束 Composer 安装行为,不改变运行时实际 PHP 版本。也就是说,你写 "php": "^8.3",但服务器上跑的是 PHP 8.1,代码照样会执行——直到遇到 match 表达式或只读属性这类语法报错才崩。
真正防住问题的方式,是把 php -v 检查和 composer install 绑定在同一个 CI 步骤里,并且部署前做一次 php --ini + php -m 核对扩展可用性。约束写得再准,运行环境不一致,就只是纸面合规。










