应显式调用目标PHP二进制执行composer install,如Linux/macOS用/usr/bin/php8.1 composer install,Windows用"C:\php\php81\php.exe" composer install;platform配置仅影响依赖解析,不改变运行时行为。

composer install 报“PHP version does not satisfy that requirement”怎么办
直接原因是 composer install 拿当前 shell 里 php -v 的版本去校验 composer.json 里的 "php": "^8.1" 约束,不匹配就中断。它不看你的目标环境,只看运行 Composer 的那个 PHP 解释器。
别切系统默认 PHP(比如 update-alternatives),那会影响其他项目甚至系统工具。正确做法是显式调用目标 PHP 二进制:
- Linux/macOS:
/usr/bin/php8.1 composer install - Windows:
"C:\php\php81\php.exe" composer install
这样 Composer 就按 8.1 去解析依赖、生成 vendor/autoload.php 和 composer.lock,不会误判。
platform 配置到底起什么作用
"config": { "platform": { "php": "8.2" } } 是编译期“假装”,只影响 install/update 阶段的依赖求解逻辑,不改变任何运行时行为。
立即学习“PHP免费学习笔记(深入)”;
适用场景举例:
- 你在本地用 PHP 7.4,但部署机是 8.2,想提前生成适配 8.2 的
vendor/ - CI 流水线中固定解析环境,避免因 runner PHP 版本浮动导致锁文件不一致
不适用场景:
- 本地 PHP 是 7.4,却指望加了
"php": "8.2"就能跑match表达式——运行时仍报ParseError: unexpected token "match" - 子项目不会继承父项目的
platform,每个项目必须单独配
切换 PHP 版本后 vendor 能复用吗
不能。哪怕只是从 8.1 升到 8.2,也必须删掉 vendor/ 和 composer.lock,再重新 composer install。
原因不是 autoload 文件本身绑定了版本,而是:
- 某些包的
autoload_static.php会根据 PHP 反射行为生成类映射,8.1 和 8.2 的反射结果可能不同 - 部分包在
install阶段执行脚本(如生成 stub、编译配置),这些脚本输出可能依赖语言特性 -
composer.lock里记录的是“在某 PHP 版本下解析出的精确版本”,跨版本复用会导致依赖树错位
升级 PHP 后依赖装不上,怎么一步步排查
先别急着 composer update,容易引发连锁冲突。推荐分三步走:
- 运行
composer show --installed --format=json,导出当前已装包列表,逐个检查它们的composer.json是否声明支持新 PHP 版本(重点看"require": {"php": "..."}) - 对不兼容的包,用
composer why vendor/package查谁在依赖它;若它是间接依赖,优先更新直接依赖项(如框架、ORM) - 需要临时绕过检查时,仅限开发环境用
composer install --ignore-platform-reqs,但务必配合config.platform.php设置好目标版本,否则锁文件会失真
最常被忽略的一点:即使 composer install 成功,也要验证运行时——比如启动服务、跑单元测试,因为 platform 不会修复语法级不兼容。



















