"php": "^8.1" 在 require 中是真实环境硬性校验,Composer 调用 php -v 比对版本;config.platform.php 是编译期欺骗,仅影响依赖选择;--platform 参数优先级最高,但不解决运行时兼容性问题。

composer.json 里写 "php": "^8.1" 是校验真实环境,不是伪装
这行配置出现在 require 字段下,比如:
"require": {
"php": "^8.1",
"laravel/framework": "^10.0"
}
它会让 composer install 直接失败,如果当前 CLI 运行的 PHP 版本不满足要求。这不是“假装”,而是硬性检查——Composer 会调用 php -v 获取真实版本,再比对约束。
- 常见错误:在 PHP 7.4 环境下执行
composer install,报错Your PHP version (7.4.33) does not satisfy that requirement - 它不关心你本地有没有
platform配置,也不管你是不是只想生成 vendor 目录 - 这个字段只在
install和update阶段起作用,不影响运行时行为 - 如果你改了系统默认 PHP(如用
update-alternatives),它立刻生效;但只改PATH不够,得确保php命令指向目标二进制
config.platform.php 是“编译期欺骗”,只影响依赖选择
它写在 config 下,例如:
"config": {
"platform": {
"php": "8.1.10"
}
}
这行不会让 Composer 换 PHP 解释器,也不会让低版本 PHP 支持 readonly 或 match。它只干一件事:在解析 require 时,把 php 当作平台包来选版本。
立即学习“PHP免费学习笔记(深入)”;
- 比如你本地是 PHP 8.2,但设了
"php": "8.1.10",Composer 就不会选ramsey/uuid ^4.7(该版要求 PHP 8.2+) - 必须带小版本号(如
8.1.10),写8.1会导致某些包误判兼容性 - 删除它要用
composer config --unset config.platform.php,漏掉--unset会覆盖整个config对象 - 它对
composer install无效,除非 lock 文件是用相同platform生成的;否则 install 仍按 lock 里的版本装,不管 platform
--platform=php:X.Y.Z 命令行参数优先级最高
这是唯一能在 install 和 update 两个阶段都强制覆盖平台信息的方式:
composer install --platform=php:8.1.10 --platform=ext-mbstring:1.0.0
它比 composer.json 里的 platform 配置优先级高,也比系统实际 PHP 版本更“权威”——Composer 完全按你给的值去匹配依赖。
- 适合 CI/CD 场景:同一台机器上部署多个 PHP 版本目标环境
- 可组合多个
--platform,比如同时指定 PHP 和扩展版本 - 它不改变
php命令本身,所以vendor/autoload.php运行时仍受限于真实 PHP 能力 - 注意:如果目标扩展在真实 PHP 中根本没安装(比如
ext-redis未启用),--platform只能绕过 Composer 校验,运行时报Class not found仍是必然
宝塔、XAMPP、多版本共存时,路径比配置更重要
在宝塔面板或 macOS Homebrew 多版本环境中,composer.json 里的任何 platform 都救不了你——因为 Composer 默认调用的是 /usr/bin/php,而宝塔的 PHP 在 /www/server/php/82/bin/php,Homebrew 的可能在 /opt/homebrew/bin/php81。
- 最可靠做法永远是显式指定 PHP 路径:
/www/server/php/82/bin/php /usr/bin/composer install - 别信
.php-version文件,它只被某些 shell 插件(如 phpenv)识别,Composer 自己完全无视 - Windows 用户注意
composer.bat第二行硬编码的 PHP 路径,改PATH不生效 - 每次切换 PHP 版本后,务必删掉
vendor/和composer.lock重装,否则 autoload_static.php 可能因反射行为差异失效
真正容易被忽略的点是:platform 配置和 --platform 参数都只解决“依赖能不能装”,不解决“装完能不能跑”。语法、扩展、opcache 配置、甚至 php.ini 里 disable_functions 的内容,全得靠真实环境兜底。



















