composer show --platform-check只验证当前环境是否满足指定包的require.php和ext-*声明,不扫描源码兼容性;它不预测包在其他php版本能否运行,仅回答“本地php+扩展能否安装该包”。

composer show --platform-check 不是查兼容性,而是查当前环境是否满足包要求
执行 composer show --platform-check vendor/package 时,它只做一件事:用你当前 PHP 版本和已加载扩展,去比对该包 composer.json 中声明的 require.php 和 require.ext-*。它不预测“这个包能不能在 PHP 7.4 上跑”,只回答“我本地 PHP 8.2 + ext-gd 能不能装它”。
常见错误现象:composer show --platform-check monolog/monolog 显示 OK,但部署到 PHP 7.4 环境却报 ParseError: syntax error, unexpected token "match"——因为 Monolog 3.x 本身用了 PHP 8.0+ 语法,而它的 composer.json 只写了 "php": "^7.2 || ^8.0",没约束源码级兼容性。
- 这个命令不会扫描包的源码,不关心它内部有没有用
str_contains()或enum - 它依赖包作者自己写对
require.php;如果作者漏写或写宽了(比如写成"^7.0"却用了 PHP 8.1 特性),--platform-check就会误判 - 输出里出现
ext-zip: * (missing)并不意味着包不支持 PHP 7.4,只说明你当前 CLI 的 PHP 没启 zip 扩展(可能 Web SAPI 启了,但 CLI 没)
真正查某个包在 PHP 7.4 下能不能用,得看它的 composer.json + 发布历史
包的 PHP 兼容性藏在两个地方:一是它每个版本的 composer.json 里 require.php 字段,二是它实际代码是否真适配。前者可查,后者得靠工具扫描或人工确认。
实操建议:
- 用
composer show -a vendor/package查所有可用版本,再逐个看 tag 或 release 页面的composer.json(例如访问https://github.com/symfony/http-foundation/tree/v5.4.36/composer.json) - 重点对比不同版本的
"php":值:v5.4.x 写"^7.2.5 || ^8.0",v6.0.x 改成"^8.0.2",就说明 v6 开始放弃 PHP 7.4 - 别信 README 里写的“支持 PHP 7.4+”——有些包在 7.4 上能装,但运行时调用
mb_ord()(PHP 7.2+)没问题,调用mb_grapheme_extract()(PHP 8.2+)就挂了
用 phpcompatibility + PHPCS 扫描包源码才知真实兼容边界
想确认 vendor/symfony/console 在 PHP 7.4 下会不会因用了 #[\Attribute] 报错?composer show 不管这事,必须静态扫描源码。
步骤很简单:
- 进项目根目录,执行
composer require --dev phpcompatibility/php-compatibility squizlabs/php_codesniffer - 运行
vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 7.4 vendor/symfony/console/src/ - 输出里带
PHP version 7.4 does not support的行,就是真实不兼容点(比如match、readonly、new Foo())
注意:--runtime-set testVersion 7.4 必须显式指定,否则默认只扫 PHP 5.6 兼容问题;而且它只报“目标版本原生不支持”的语法/函数,不报“扩展缺失”或“行为差异”(如 json_encode() 在 PHP 7.3 和 8.0 返回值类型不同)。
CI 里批量验证多个 PHP 版本下的包兼容性
单靠本地扫 vendor 目录意义有限——你要的是“这个包在 PHP 7.4/8.0/8.1 下都能装且跑通”。这时候得结合 Composer 的 platform 配置 + 多版本环境。
关键操作:
- 在
composer.json里加"config": {"platform": {"php": "7.4.33"}},然后composer install --no-dev—— 这会强制选 PHP 7.4 兼容的依赖版本(哪怕你本地是 PHP 8.2) - 用 GitHub Actions 的
matrix跑多版本:对每个 PHP 版本,先setup-php,再composer install --ignore-platform-reqs(跳过平台检查,只装包),最后php -d error_reporting=E_ALL vendor/bin/phpcs ...扫描 - 别把
config.platform.php提交到主分支——它只是 CI 临时模拟用的,否则开发者本地会误以为“PHP 7.4 就该这么跑”
最易被忽略的一点:很多包的兼容性断层不在主版本号,而在小版本。比如 guzzlehttp/guzzle v7.5.0 开始要求 ext-curl >= 7.62.0,而某些 PHP 7.4 官方镜像自带的 curl 是 7.58.0 —— 这类问题只能靠 CI 真机跑测试暴露,静态扫描也看不到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











