You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPUnit生成Clover XML覆盖率报告时preprocessGrammar重复声明报错

问题根因

这个错误是由于phpunit开启覆盖率统计时,你的配置会扫描根目录下所有PHP文件(包括vendor目录下的第三方依赖文件),nikic/php-parser包中的phpyLang.php文件包含无命名空间的全局函数preprocessGrammar(),被覆盖率组件重复加载时就会触发重定义报错。

解决方法

  1. 调整phpunit.xml的覆盖率配置,优先指定需要统计的业务源码目录,同时排除不需要统计的第三方目录、缓存目录等,修改后的<coverage>段配置如下:
<coverage processUncoveredFiles="true">
    <include>
        <!-- 仅统计你自己的业务代码目录,比如src,不要直接写根目录. -->
        <directory suffix=".php">./src</directory>
    </include>
    <exclude>
        <!-- 强制排除第三方依赖目录 -->
        <directory suffix=".php">./vendor</directory>
        <!-- 其他不需要统计的目录也可以加在这里,比如缓存、测试目录等 -->
        <directory suffix=".php">./.phpunit.cache</directory>
        <directory suffix=".php">./tests</directory>
    </exclude>
    <report>
        <clover outputFile="phpunit.coverage.xml"/>
    </report>
</coverage>
  1. 如果调整后仍报错,可以直接将processUncoveredFiles参数改为false,关闭未覆盖文件的自动扫描,也可以规避重复加载的问题。
  2. 额外检查composer.json的autoload配置,确认没有手动引入vendor/nikic/php-parser/grammar目录下的文件。

内容的提问来源于stack exchange,提问作者Oleg Dmitrochenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:45:04