php 声明是给 composer install/update 看的,用于在依赖解析阶段校验本地 php 版本是否满足要求;不满足则中止安装并报错,该检查早于包下载。

Composer 安装失败时提示 requires php ^8.1 但本地是 PHP 7.4?不是 Composer 本身限制版本,而是 composer.json 里 php 的 require 字段在起作用 —— 它告诉 Composer:“这个包只能装在满足该 PHP 版本的环境里”。
composer.json 中的 php require 是给谁看的?
它不是给服务器或 PHP 解释器看的,而是给 composer install / composer update 这两个命令看的。当本地 PHP 版本不满足 "php": "^8.0" 这类声明时,Composer 会直接中止安装,并报错:
Root composer.json requires php ^8.0 but your php version (7.4.33) does not satisfy that requirement.
这个检查发生在依赖解析阶段,早于任何包下载。
- 对
require下的包(如"monolog/monolog": "^2.8"),Composer 会读取其composer.json中的php声明,做兼容性过滤 - 对根项目(你的项目),
composer.json中的php声明只影响当前项目的安装行为,不约束子依赖的运行时版本 - 如果你用
composer create-project初始化项目,该声明也参与目标项目是否可被创建的判断
如何正确声明 PHP 版本范围?
用 require 下的 php 键,值为语义化版本约束字符串。常见写法有:
立即学习“PHP免费学习笔记(深入)”;
-
"php": "^7.4"→ 允许 7.4.0 到 "php": ">=7.4.0 → 更精确控制上下界,排除 8.2+-
"php": "8.1.*"→ 仅允许 8.1.x,不含 8.2 或 8.0 "php": ">=8.0.0 || >=7.4.0 → 多区间(少见,易出错,不推荐)
注意:^ 是最常用也最安全的写法;避免用 * 或 ~(~7.4 等价于 >=7.4.0 ,容易误判)。
为什么加了 php 限制,某些包还是装不上?
因为包作者可能在其自己的 composer.json 中写了更严格的 php 要求。比如你声明 "php": "^8.0",但想装的包只支持 "php": "^8.2",Composer 就不会选它 —— 即使你本地是 PHP 8.3。
- Composer 默认启用
platform-check,会校验整个依赖树的 PHP 兼容性 - 可通过
composer install --ignore-platform-req=php临时跳过(不推荐用于生产) - 也可在
config.platform.php中伪造平台版本(用于 CI 构建或跨环境测试):
"config": {
"platform": {
"php": "8.1.0"
}
}
这会让 Composer “假装”运行在 PHP 8.1 下,从而绕过真实环境的版本检查 —— 但运行时仍可能因语法或函数缺失而崩溃。
实际项目中容易忽略的点
很多团队只关注框架或扩展的 PHP 版本要求,却忘了 composer.json 中的 php 声明必须和 .php-version、CI 配置(如 GitHub Actions 的 php-version)、Dockerfile 中的 FROM php:8.1 保持一致。
- 开发机升级 PHP 后忘记更新
composer.json,导致队友composer update失败 - CI 流水线用了旧版 PHP 镜像,但
composer.json已升到^8.2,构建直接中断 -
config.platform.php被误提交进仓库,导致本地开发环境“以为”自己跑在高版本上,实际运行时报Undefined constant FILTER_VALIDATE_EMAIL这类低版本缺失特性错误
真正关键的不是写对一行 "php": "^8.1",而是让这个声明成为整个交付链路中 PHP 版本事实的唯一来源。











