开发工具代码质量静态分析【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址https://gitcode.com/gh_mirrors/ph/phpstan点击查看免费下载导读mod.rightNonNumeric是 PHPStan 在启用phpstan/phpstan-strict-rules严格规则扩展后产生的一个错误标识符Error Identifier用于在静态分析阶段捕获取模运算%右操作数不是数值类型的代码。本文以 website/errors/mod.rightNonNumeric.md 为骨架结合当前仓库中该标识符的元数据映射、规则类归属以及端到端测试配置系统讲解该错误的触发条件、PHP 语言层面的根因以及两类标准的修复方案帮助你写出在运行时不会产生意外结果或TypeError的取模代码。一、认识这个错误标识符在 PHPStan 生态中错误标识符Error Identifier是每条报错消息的机器可读标签。mod.rightNonNumeric属于操作数非数值NonNumeric operand标识符家族——以 website/errors 目录为例该家族覆盖了div、minus、mod、mul、plus、pow六种算术运算符的左/右两侧共 12 个标识符例如 mod.leftNonNumeric.md、div.rightNonNumeric.md 等。原文档的前置元数据frontmatter给出了该标识符的官方定义titlemod.rightNonNumericshortDescriptionRight side of the modulo operator is not a numeric type.取模运算符的右侧不是数值类型。ignorabletrue表示该错误可通过phpstan-ignore注释或ignoreErrors配置予以抑制。标识符与规则类的映射当前仓库的 website/src/errorsIdentifiers.json 记录了该标识符与规则类的对应关系mod.rightNonNumeric: { PHPStan\\Rules\\Operators\\OperandsInArithmeticModuloRule: { phpstan/phpstan-strict-rules: [ https://github.com/phpstan/phpstan-strict-rules/blob/2.1.x/src/Rules/Operators/OperandsInArithmeticModuloRule.php#L59 ] } }这段映射揭示了两条关键事实其一报告该错误的具体规则类为PHPStan\Rules\Operators\OperandsInArithmeticModuloRule其二该规则并不位于 PHPStan 核心phpstan-src而是由独立的扩展包phpstan/phpstan-strict-rules提供这解释了为什么默认安装的 PHPStan 不会报出此类错误。在errorsIdentifiers.json中mod.leftNonNumeric同样指向该规则类的第 51 行说明左、右操作数的校验分别落在规则的上下两段逻辑中。二、触发示例什么样的代码会被报告原文档给出了一个最小可复现示例见 website/errors/mod.rightNonNumeric.md?php declare(strict_types 1); function doFoo(int $a, bool $flag): void { $result $a % $flag; }在这个函数中取模运算符%的左操作数$a是int没有问题但右操作数$flag是bool类型。一旦doFoo()被调用PHP 运行时会对$flag执行隐式类型转换后再取模——这正是该规则要拦截的危险模式。与之对比姊妹标识符mod.leftNonNumeric见 website/errors/mod.leftNonNumeric.md捕获的是同一运算符左侧操作数非数值的情况?php declare(strict_types 1); function remainder(bool $flag, int $b): int { return $flag % $b; }二者共用OperandsInArithmeticModuloRule规则只是分别检查%表达式的左右两侧。三、为什么会报告PHP 语义根因与 strict-rules 的定位原文档明确指出This error is reported byphpstan/phpstan-strict-rules。要理解它的设计意图需要先了解 PHP 的取模运算语义PHP 的%运算符期望两个操作数都是数值类型int或float。当操作数是其他类型时PHP 会先尝试将其强制转换为数值。隐式转换结果不可预期。例如bool值true会被转换为1、false被转换为0null在某些版本下会被转换为0数组和对象则根本无法参与算术运算。把$flag % $b写成$flag为true时的1 % $b几乎可以断定不是开发者的本意。在严格模式strict_types 1下非法转换会抛出TypeError导致程序在运行时直接崩溃而在非严格模式下则会静默产生诡异的结果更难排查。phpstan-strict-rules 之所以被定位为strict rules严格规则是因为它不同于 PHPStan 默认规则集中那些确定会出错的检测而是主动拦截几乎必然是笔误或类型设计缺陷的代码模式。取模右操作数为bool、null、array、object等非数值类型正是这类高风险写法静态分析阶段即可发现无需运行代码。从仓库的端到端测试也可以印证 strict-rules 的实际装配方式。例如 e2e/phpstan.neon 通过 include 引入扩展的规则集includes: - vendor/phpstan/phpstan-strict-rules/rules.neon而 playground-runner/runner-config.phpPHPStan Playground 运行器的配置构建函数展示了 strict-rules 如何作为可选开关按需加入分析流程$configFiles [ $rootDir . /playground.neon, $rootDir . /vendor/phpstan/phpstan-deprecation-rules/rules.neon, ]; if ($strictRules) { $configFiles[] $rootDir . /vendor/phpstan/phpstan-strict-rules/rules.neon; }即仅在用户勾选 strictRules 选项时rules.neon才会被写入最终 NEON 配置从而激活mod.rightNonNumeric等严格规则。四、如何修复两种标准方案原文档提供了两种修复路径均要求确保右操作数在参与运算前已经是数值类型。方案一收窄类型声明推荐直接修复根因最干净的修复方式是修改函数签名让右参数本身就是数值类型?php declare(strict_types 1); -function doFoo(int $a, bool $flag): void function doFoo(int $a, int $b): void { - $result $a % $flag; $result $a % $b; }这种做法的优势在于从源头消除了类型问题。调用方在编译期就会受到类型约束bool值根本无法传入天然杜绝了隐式转换的可能。方案二在运算前显式转换如果业务逻辑确实需要从非数值类型例如从配置、表单或标志位推导参与取模应在使用前显式转换?php declare(strict_types 1); function doFoo(int $a, bool $flag): void { - $result $a % $flag; $result $a % (int) $flag; }显式(int)强制转换把类型转换从 PHP 的隐式行为变成了开发者有意为之的操作语义一目了然。类似的(float)转换可用于需要浮点精度参与的取模场景注意 PHP 的%会把 float 操作数隐式转为 int 后运算。修复顺序建议依据 website/errors/CLAUDE.md 的文档规范优先修复真实 bug修正业务逻辑其次通过原生类型声明收窄类型再考虑 PHPDoc 类型收窄最后才是在函数体内做类型收窄或显式转换。上面两种方案分别对应其中的第二与第四梯队。五、实际项目中的接入与验证1. 安装 strict-rules 扩展mod.rightNonNumeric不随 PHPStan 核心发布需要在项目中安装扩展包composer require --dev phpstan/phpstan-strict-rules安装完成后在phpstan.neon中 include 其规则集参考 e2e/phpstan.neonincludes: - vendor/phpstan/phpstan-strict-rules/rules.neon重新运行分析即可看到类似输出Line app/Example.php 14 Right side of % is not numeric. Right side of the modulo operator is not a numeric type.2. 结合端到端测试验证行为仓库的 e2e 测试体系提供了 strict-rules 生效后的结果样本。在 e2e/data/strictRulesExtension-0.json 中可以看到启用 strict-rules 后测试期望的报错以 JSON 形式断言该样本展示的是同类严格规则对静态方法动态调用的检测行号与ignorable字段均被断言{ message: Dynamic call to static method PHPStan\\E2E\\DynamicCallToStaticMethod::bar()., line: 10, ignorable: true }这印证了 strict-rules 扩展报告的每条错误都带有ignorable: true元数据与mod.rightNonNumeric文档 frontmatter 中的ignorable: true一致——即这类严格规则错误可以通过标准的忽略机制按标识符定向豁免例如// phpstan-ignore mod.rightNonNumeric $result $a % $flag;或在该规则被判定为误报的特定文件中通过ignoreErrors配置排除。需要强调的是原文档的修复哲学是先修正类型问题而非一上来就忽略只有当代码确实是有意为之例如依赖 PHP 的隐式数值转换的遗留逻辑时忽略才有意义。3. 在 PHPStan Playground 中复现如果你只想快速验证该规则无需本地安装——playground-runner/runner-config.php 表明 PHPStan Playground 运行器在收到strictRules: true请求时会把vendor/phpstan/phpstan-strict-rules/rules.neon加入配置粘贴文首的触发示例并开启 Strict rules 选项即可看到mod.rightNonNumeric报错。六、与同类标识符的横向对比mod.rightNonNumeric并非孤例PHPStan 对六种算术运算符都提供了对称的非数值操作数检测。当前仓库 website/errors 目录下可找到以下系列文档运算符左操作数标识符右操作数标识符plus.leftNonNumeric.mdplus.rightNonNumeric.md-minus.leftNonNumeric.mdminus.rightNonNumeric.md*mul.leftNonNumeric.mdmul.rightNonNumeric.md/div.leftNonNumeric.mddiv.rightNonNumeric.md%mod.leftNonNumeric.mdmod.rightNonNumeric本文**pow.leftNonNumeric.mdpow.rightNonNumeric.md所有 12 个标识符的修复思路一致让参与算术运算的操作数在静态分析阶段就是确定的数值类型。以 div.rightNonNumeric.md 为例其修复方案同样是将右操作数改为float类型或使用(int)显式转换与取模场景完全同构——这是整套 strict-rules 算术检测的统一设计原则。七、实战建议小结开启 strict-rules 的价值默认 PHPStan 只报告必然出错的代码mod.rightNonNumeric这类规则补上了类型设计隐患这一层尤其适合对数据类型严格要求的金融计算、协议解析、位运算等场景。优先修复签名而非忽略bool % int在绝大多数情况下都是逻辑缺陷用原生类型声明收窄是最优解。忽略需有据可依确认代码有意依赖 PHP 隐式转换时使用phpstan-ignore mod.rightNonNumeric定点豁免并为该决策补充注释说明。善用标识符文档遇到任何mod.*、div.*、plus.*等报错可对照 website/errors 目录下同名文档获取标准示例与修复范式。通过本文你已完整掌握mod.rightNonNumeric的触发条件、底层规则归属OperandsInArithmeticModuloRule来自phpstan-strict-rules、两类修复方案及实际接入方式能够在自己的项目中精准定位并消除取模运算的类型隐患。赞分享开发工具代码质量静态分析【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址https://gitcode.com/gh_mirrors/ph/phpstan点击查看免费下载相关推荐PHPStan 错误标识符解析pow.rightNonNumeric —— 幂运算符右操作数非数值的检测与修复PHPStan 错误标识符解析pow.rightNonNumeric —— 幂运算符右操作数非数值的检测与修复 本篇文章围绕 PHPStan 错误标识符文档开发工具代码质量静态分析PHPStan 错误标识 minus.rightNonNumeric 完全指南减法右操作数非数值类型的检测与修复PHPStan 错误标识 minus.rightNonNumeric 完全指南减法右操作数非数值类型的检测与修复 导读 minus.rightNonNumer开发工具代码质量静态分析PHPStan 错误标识符 mul.rightNonNumeric 详解乘法运算符右操作数非数值类型PHPStan 错误标识符 mul.rightNonNumeric 详解乘法运算符右操作数非数值类型 mul.rightNonNumeric 是 PHPSta开发工具代码质量静态分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考