PHPStan 错误标识符 `mod.rightNonNumeric` 完全指南:取模运算右操作数非数值类型的检测与修复
开发工具代码质量静态分析【免费下载链接】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),仅供参考

相关新闻

无感FOC角度抖动终结者:PLL锁相环替代滑膜观测器实战

无感FOC角度抖动终结者:PLL锁相环替代滑膜观测器实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:12:54 阅读更多 →
TEN Framework 视频语音助手示例 voice-assistant-video:快速上手与架构深度解析

TEN Framework 视频语音助手示例 voice-assistant-video:快速上手与架构深度解析

人工智能AI Agent多模态语音AI 应用 【免费下载链接】ten-framework Open-source framework for conversational voice AI agents 项目地址: https://gitcode.com/TEN-framework/ten-framework 点击查看 免费下载 视频语音助手(Voice Assistant with Vi…

2026/9/24 7:12:54 阅读更多 →
学习C语言途中的里程碑

学习C语言途中的里程碑

学扫雷游戏有感在完成扫雷游戏的过程中我遇到了各种各样的困难,例如分不清主次函数经常会有头文件的忘加等等语法错误编辑错误和运行错误,如果没有老师们的帮助我可以说是寸步难行,本身我感觉自己已经学的不错但从这之后我才意识到自己只是学…

2026/9/24 7:12:54 阅读更多 →

最新新闻

小米解锁工具Fastboot连接失败?驱动安装与排错全指南

小米解锁工具Fastboot连接失败?驱动安装与排错全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 10:02:03 阅读更多 →
AI Coding 时代下,我的技术面试实践分享

AI Coding 时代下,我的技术面试实践分享

从年初到现在,大家在 AI Coding 时代的工作方式已经有了很大变化,但我当时在社区交流时发现,大家的面试方式似乎没有相应调整。正好今年五六月开始,我作为面试官进行了多场面试。在这个过程中也尝试调整了一些面试方式。以下是我从…

2026/9/24 10:02:03 阅读更多 →
Swagger-Codegen Java(Jersey 1)客户端详解:AnotherFakeApi 与 testSpecialTags 的生成与调用

Swagger-Codegen Java(Jersey 1)客户端详解:AnotherFakeApi 与 testSpecialTags 的生成与调用

开发工具代码生成API设计 【免费下载链接】swagger-codegen swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. 项目地址: http…

2026/9/24 10:02:03 阅读更多 →
2026企业AI办公工具选型指南:从场景匹配评估AI工作平台

2026企业AI办公工具选型指南:从场景匹配评估AI工作平台

企业在采购AI办公工具时,很容易陷入功能清单对比的误区。很多数字化负责人会直接统计工具具备多少项能力,或是以单次对话的效果作为评判依据,也有团队会单纯依据报价、品牌知名度做决策。这类评估方式容易造成采购后的落地断层:工…

2026/9/24 10:02:03 阅读更多 →
Linux内核参数调优实战:从/proc/sys到sysctl全面解析

Linux内核参数调优实战:从/proc/sys到sysctl全面解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 10:02:03 阅读更多 →
Juniper SRX防火墙HA双机配置实战:Chassis Cluster部署与切换验证

Juniper SRX防火墙HA双机配置实战:Chassis Cluster部署与切换验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 10:01:02 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →