infection 在 php 7.2 上无法运行是硬性限制,因其依赖 php 7.4+ 的 reflectionuniontype 等反射特性,旧版(如 v0.25.x)已 eol 且覆盖率功能失效;推荐升级 php 至 7.4+,或改用 phpstan + 强化断言替代。

Infection 在 PHP 7.2 上无法正常运行,这是硬性限制,不是配置或操作问题。
Infection 自 2023 年起已明确要求 PHP ≥ 7.4(见 adr/0005-Bump-PHP-versions.md),所有后续版本(包括当前最新稳定版)均不兼容 PHP 7.2。你执行 infection 命令时大概率会遇到类似以下错误:
PHP Fatal error: Uncaught Error: Call to undefined method ReflectionUnionType::getName()
这个错误源于 PHP 7.2 缺失对联合类型(ReflectionUnionType)等现代反射 API 的支持,而 Infection 的 AST 分析与 Mutator 系统重度依赖这些特性。
为什么不能“降级 Infection 版本来适配 PHP 7.2”
你可能会查到旧版 Infection(如 v0.25.x)标称支持 PHP 7.2,但实际不可行:
- 这些版本早已 EOL(End-of-Life),不再维护,且严重缺乏突变器(mutators)和覆盖率集成能力;
- 它们依赖的
phpunit/php-code-coverage也早已放弃 PHP 7.2 支持; - 即便强行安装,
--coverage选项基本失效,pcov或xdebug覆盖数据无法被正确解析,导致 “No tests executed” 或 “0 mutants generated”。
如果你暂时无法升级 PHP,替代方案只有两个务实选择
先升级 PHP 到 7.4+(推荐)
PHP 7.2 已于 2020 年 11 月正式停止所有支持(包括安全更新),继续使用存在明确风险;Docker、CI 环境或云主机上升级 PHP 小版本(如 7.2 → 7.4)通常只需修改一行配置,成本远低于维护一套失效的测试质量工具链。-
用静态分析 + 强化 PHPUnit 断言代替突变测试
若升级短期不可行,可立即做三件事提升测试有效性:- 启用
phpstanlevel 6+,它能捕获大量边界逻辑缺陷(如未处理null、类型隐式转换) - 把弱断言
$this->assertTrue($result)全部改为$this->assertSame(true, $result)或$this->assertEquals(42, $value) - 对每个
if/switch分支补一个“刚好触发该分支”的测试用例(例如if ($x > 0)必须测$x = 1、$x = 0、$x = -1)
- 启用
真正卡住你提升覆盖率的,从来不是工具跑不起来,而是测试本身没覆盖边界、断言没验证值而是只验真假——这点在 PHP 7.2 和 8.2 下都一样。Infection 只是把这个问题照得更亮而已。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











