PHPStan 错误标识符 mod.leftNonNumeric 深度解析:取模运算左操作数非数值类型 开发工具代码质量静态分析【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址https://gitcode.com/gh_mirrors/ph/phpstan点击查看免费下载本篇文章以 PHPStan 官方错误文档 website/errors/mod.leftNonNumeric.md 为核心结合 phpstan-strict-rules 扩展包在仓库中的规则映射与端到端测试配置深入讲解mod.leftNonNumeric这条 strict 级别错误规则的触发条件、底层原理与标准修复姿势。读完本文你将能够在自己的项目中快速识别%取模运算的左操作数类型问题并掌握从「改类型声明」到「显式强转」的完整修复思路。错误标识符是什么mod.leftNonNumeric是 PHPStan 在启用phpstan-strict-rules扩展后可能报告的一条错误标识符。其官方 shortDescription 定义为Left side of the modulo operator is not a numeric type.即「取模运算符%的左侧操作数不是数值类型」。该标识符用于机器可读的错误定位在 CI 输出、编辑器诊断或ignoreErrors配置中都可以直接以mod.leftNonNumeric作为键名引用这条规则。在仓库的 website/src/errorsIdentifiers.json 中该标识符被映射到 strict-rules 扩展包内的规则类mod.leftNonNumeric: { PHPStan\\Rules\\Operators\\OperandsInArithmeticModuloRule: { phpstan/phpstan-strict-rules: [ https://github.com/phpstan/phpstan-strict-rules/blob/2.1.x/src/Rules/Operators/OperandsInArithmeticModuloRule.php#L51 ] } }从这份映射可以看出两点关键信息该规则由OperandsInArithmeticModuloRule类负责实现源码位置指向 strict-rules 2.1.x 的src/Rules/Operators/OperandsInArithmeticModuloRule.php第 51 行左操作数检查分支同一规则类还负责右侧操作数的检查即映射表紧邻的mod.rightNonNumeric对应同文件第 59 行因此%运算两侧都会被严格校验。这些以*NonNumeric结尾的标识符并非孤立存在、-、*、/、**等算术运算符都有对应的左/右操作数检查标识符例如div.leftNonNumeric、mul.leftNonNumeric、plus.leftNonNumeric、pow.leftNonNumeric等仓库的 website/errors 目录中均有对应文档mod系列是其中针对取模运算的一对。触发示例原文档给出了一段最小化触发代码?php declare(strict_types 1); function remainder(bool $flag, int $b): int { return $flag % $b; }这里$flag被声明为bool类型却直接参与了%取模运算。PHPStan在 strict 规则加持下会在此处报告mod.leftNonNumeric取模运算的左侧是bool不是合法的数值类型。值得留意的是declare(strict_types 1);这一行在严格类型模式下PHP 运行时对「弱类型隐式转换」的容忍度大幅收窄非数值类型直接参与算术运算更可能在运行时抛出TypeError。strict 规则正是为了在运行之前就拦住这类隐患。为什么会被报告从 PHP 语言语义出发%取模/求余是算术运算符它的语义前提是两个操作数都必须是数值int或float。当左侧操作数是bool时PHP 在运行时虽然会尝试将非数值强制转换为数字例如true→1、false→0但这种隐式转换会带来两类实际风险结果与直觉不符true % 3在运行时被转换为1 % 3得到1。这类「碰巧能跑」的代码通常掩盖了真实的逻辑错误——开发者大概率是把某个本应承载数值的变量传错了位置。严格模式下抛异常在strict_types 1的文件中非数值参与算术运算的行为更加敏感可能在运行时直接抛出TypeError导致线上崩溃。因此PHPStan 规定算术运算中只应使用int和float类型。bool、array、object、null、string非数字字符串等出现在%左侧都意味着代码存在逻辑错误。这条规则由phpstan/phpstan-strict-rules扩展包提供并不包含在 PHPStan 核心默认规则中——核心 PHPStan 更倾向于「只报告必然出错或必然无效的代码」而 strict-rules 则进一步收紧边界报告「几乎肯定是 bug」的模式。在仓库的 e2e/phpstan.neon 端到端测试配置中可以看到strict 规则的启用方式正是通过 include 该扩展包的规则文件includes: - vendor/phpstan/phpstan-strict-rules/rules.neon如何修复方案一修正操作数的真实类型推荐如果取模运算的左侧本来就应当是一个数值那么直接修正参数的类型声明让类型反映真实意图-function remainder(bool $flag, int $b): int function remainder(int $a, int $b): int { - return $flag % $b; return $a % $b; }这是最彻底的修复方式——类型声明与使用方式一致mod.leftNonNumeric自然消失且任何调用方传入非数值都会被 PHPStan 或运行时拦下。方案二显式类型转换如果调用方传参无法改变例如确实需要把bool转换为数字参与运算则应使用显式转换表达「这里是有意转换」function remainder(bool $flag, int $b): int { - return $flag % $b; return (int) $flag % $b; }显式(int)强转将意图明示给读者与静态分析器你清楚地知道$flag不是数值但你有意将其转为整数。需要说明的是bool转int的语义是true→1、false→0请确认这确实是业务想要的语义。修复优先级建议根据仓库 website/errors/CLAUDE.md 中对错误文档编写规范的约定修复方式的推荐顺序为先修复真实 bug修正类型声明其次用原生类型声明收窄类型再考虑显式强转等更局部的处理。这也正对应本文两种方案的排列顺序。与其他算术规则的关联mod系列是 strict-rules 中「算术操作数必须为数值」家族的一员。仓库 website/errors 目录下与之同构的文档包括div.leftNonNumeric/div.rightNonNumeric除法/左右操作数非数值mul.leftNonNumeric/mul.rightNonNumeric乘法*左右操作数非数值plus.leftNonNumeric/plus.rightNonNumeric加法左右操作数非数值minus.leftNonNumeric/minus.rightNonNumeric减法-左右操作数非数值pow.leftNonNumeric/pow.rightNonNumeric幂运算**左右操作数非数值。它们的触发原理、修复方式与mod.leftNonNumeric完全同构只是运算符不同。若你的项目中出现多个此类标识符说明存在系统性的「非数值参与算术运算」问题值得在调用链源头统一治理类型声明。在项目中的启用与落地要在你的项目中获得mod.leftNonNumeric这条检查需要以下两步安装扩展包通过 Composer 引入phpstan/phpstan-strict-rules仓库的 e2e/composer.json 展示了在端到端测试环境中对它的依赖声明方式启用规则在phpstan.neon配置中加入includes: - vendor/phpstan/phpstan-strict-rules/rules.neon参考 e2e/phpstan.neon。启用后PHPStan 会将其作为 strict 级别规则纳入分析。mod.leftNonNumeric的ignorable属性为true见原文档 frontmatter意味着你可以通过ignoreErrors配置或phpstan-ignore-next-line注释对其进行豁免但正如本文所述这类错误通常暗示真实的逻辑缺陷豁免前请先确认代码语义。小结mod.leftNonNumeric是 phpstan-strict-rules 提供的算术操作数类型校验规则当取模运算符%的左侧不是int或float数值类型时触发。其底层由OperandsInArithmeticModuloRule实现左操作数分支位于 strict-rules 2.1.x 的src/Rules/Operators/OperandsInArithmeticModuloRule.php第 51 行与mod.rightNonNumeric及div、mul、plus、minus、pow等系列标识符共同构成完整的算术类型防线。修复时优先修正操作数类型声明必要时辅以显式强转即可在运行之前消除隐式转换带来的不确定性。赞分享开发工具代码质量静态分析【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址https://gitcode.com/gh_mirrors/ph/phpstan点击查看免费下载相关推荐PHPStan 错误标识符 div.leftNonNumeric 深度解析除法左操作数非数值类型PHPStan 错误标识符 div.leftNonNumeric 深度解析除法左操作数非数值类型 div.leftNonNumeric 是 PHPStan 在开发工具代码质量静态分析PHPStan 错误标识符 mul.rightNonNumeric 详解乘法运算符右操作数非数值类型PHPStan 错误标识符 mul.rightNonNumeric 详解乘法运算符右操作数非数值类型 mul.rightNonNumeric 是 PHPSta开发工具代码质量静态分析PHPStan 错误标识符 mul.leftNonNumeric 详解乘法运算左操作数必须为数值类型PHPStan 错误标识符 mul.leftNonNumeric 详解乘法运算左操作数必须为数值类型 mul.leftNonNumeric 是 PHPStan开发工具代码质量静态分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考