最高效方式是用shivammathur/setup-php搭建多版本测试环境,它自动识别.php-version、composer.json platform或composer.lock中的PHP版本,配合matrix策略并行验证7.4至8.5,并通过Composer platform配置锁定依赖解析,再结合PHPCompatibility静态扫描精准定位语法级不兼容问题。

直接用 shivammathur/setup-php 搭建多版本测试环境,是排查 PHP 兼容性最高效的方式。它不依赖本地配置,也不需要手动维护 Docker 镜像,几行 YAML 就能跑通从 PHP 7.4 到 8.5 的完整验证链。
自动识别项目所需 PHP 版本
不用硬写版本号,setup-php 能主动读取项目配置:
- 优先检查根目录下的
.php-version文件(内容如8.2) - fallback 到
composer.json中的config.platform.php值 - 再 fallback 到
composer.lock的platform-overrides.php
这样你改一个配置,CI 就自动跟着切版本,避免人为写错或遗漏。
矩阵式并行验证多个 PHP 版本
在 GitHub Actions 中用 strategy.matrix 一次性覆盖主流环境:
立即学习“PHP免费学习笔记(深入)”;
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
php-version: ['7.4', '8.0', '8.2', '8.5']
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: mbstring, intl, pdo_sqlite
coverage: none
- run: composer install --no-interaction
- run: vendor/bin/phpunit
每个版本独立运行,失败时能准确定位是哪个 PHP 版本下出问题,而不是笼统说“兼容性不好”。
配合 Composer platform 锁定依赖解析逻辑
仅切换 PHP 运行时还不够——Composer 安装依赖时也得按目标版本选包。在 composer.json 加上:
"config": {
"platform": {
"php": "8.1"
}
}
这样即使你在 PHP 8.5 环境里执行 composer install,它也会按 PHP 8.1 的能力去选包,提前暴露 ext-gmp 或 ReturnTypeWillChange 这类高版本才支持的依赖项。
快速定位语法/函数级不兼容点
如果某版本报错,别急着改代码,先加两步诊断:
- 在 setup-php 步骤后加
run: php -v,确认实际加载的是不是你预期的版本 - 加
run: php -m | grep -E 'xdebug|pcov|opcache',看关键扩展是否真启用 - 对报错文件,用 PHPCompatibility 扫描:
vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 8.0 src/
这类静态检查能在 CI 失败前就标出 array_key_first()、str_contains() 等 PHP 8+ 函数的使用位置。



















