首页/新闻资讯/正文详情

PHPStan 错误标识符 div.rightNonNumeric 详解:除法运算符右操作数不是数值类型

发布时间:2026/9/23 5:26:16 来源:云帆数科 栏目:资讯中心
PHPStan 错误标识符 div.rightNonNumeric 详解:除法运算符右操作数不是数值类型
PHPStan 错误标识符 div.rightNonNumeric 详解除法运算符右操作数不是数值类型【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址: https://gitcode.com/gh_mirrors/ph/phpstan导读div.rightNonNumeric是 PHPStan 在启用 phpstan-strict-rules 为骨架结合 errorsIdentifiers.json 中的规则映射与同族文档完整讲解该错误的触发条件、PHP 语言语义依据、两种修复思路以及与之配套的同类算术运算检查、-、*、%、**。读完你将对 strict-rules 的运算数必须是数值系列规则形成系统认识并能直接在自己的项目里复现、修复并配置该检查。错误标识符是什么一条错误的前缀编号在 PHPStan 2.x 中每条错误都可以携带一个机器可读的错误标识符格式类似div.rightNonNumeric。其中div表示该错误与除法division运算相关rightNonNumeric表示问题是右侧操作数不是数值类型与之对应div.leftNonNumeric.md 负责描述左侧操作数不是数值类型的情形。该文档文件的 frontmatter 记录了它的元信息title: div.rightNonNumeric shortDescription: Right side of the division operator is not a numeric type. ignorable: trueignorable: true表示该错误可以在配置中通过ignoreErrors或基线baseline机制显式忽略与那些-nonIgnorable()的强制错误不同。触发示例一段会被报告的代码文档给出了一个最小化的、必然触发该错误标识符的 PHP 示例?php declare(strict_types 1); function doFoo(int $numerator, bool $flag): void { $result $numerator / $flag; }注意示例开头固定使用declare(strict_types 1);——这是 strict-rules 类检查的典型测试环境因为非严格模式下 PHP 的弱类型转换会掩盖部分问题。这里$numerator是int而除号右侧的$flag是boolbool不属于数值类型因此 PHPStan 会报告div.rightNonNumeric。为什么会报告这个错误规则来源与 PHP 语义规则来源phpstan-strict-rules该错误并非 PHPStan 核心自带而是由phpstan/phpstan-strict-rules包提供。从本仓库的 errorsIdentifiers.json 可以看到明确的标识符到规则的映射div.leftNonNumeric: → PHPStan\Rules\Operators\OperandsInArithmeticDivisionRule (line 51) div.rightNonNumeric: → PHPStan\Rules\Operators\OperandsInArithmeticDivisionRule (line 59)也就是说div.leftNonNumeric与div.rightNonNumeric都由同一个规则类OperandsInArithmeticDivisionRule报告只是分别覆盖操作符的左侧源码第 51 行附近与右侧源码第 59 行附近的检查逻辑。该规则类位于 phpstan-strict-rules 包的src/Rules/Operators/目录下。要在项目中使用这条规则需要安装并启用 strict-rules典型的做法是composer require --dev phpstan/phpstan-strict-rules然后在phpstan.neon中包含其规则文件includes: - vendor/phpstan/phpstan-strict-rules/rules.neon启用后OperandsInArithmeticDivisionRule会对每个除法表达式做操作数类型检查一旦发现非数值类型就会报告上述标识符。PHP 语义依据除法要求数值操作数从 PHP 语言语义看除法运算符/期望两个操作数都是数值类型int或float。当右侧操作数是bool、null、array、object等非数值类型时在非严格模式下PHP 可能尝试进行弱类型转换产生不符合预期的结果在严格模式declare(strict_types 1)下则可能直接抛出TypeError。即便某些情况下bool能被运行时凑合转换成数字如true转 1、false转 0代码的意图也几乎肯定是错误的——把布尔值放进除法运算通常是参数类型设计错误或变量使用错误这正是 strict-rules 要在静态分析阶段拦截它的原因指向会导致崩溃、根本不会按预期执行、或与开发者意图不符的代码。如何修复两种由文档给出的标准方案方案一修正类型声明让右操作数真正是数值最直接的修复是修复 bug 本身——把参数类型从bool改为数值类型?php declare(strict_types 1); -function doFoo(int $numerator, bool $flag): void function doFoo(int $numerator, float $divisor): void { - $result $numerator / $flag; $result $numerator / $divisor; }方案二在使用前显式转换类型如果业务上确实需要传入一个布尔值参与运算这种情况应当非常罕见则在除法之前显式转换让类型信息与运行时行为保持一致?php declare(strict_types 1); function doFoo(int $numerator, bool $flag): void { - $result $numerator / $flag; $result $numerator / (int) $flag; }注意这里使用的是显式强转(int)而不是依赖 PHP 的隐式弱类型转换——显式转换表达了开发者的真实意图也让 PHPStan 能推导出/右侧现在是int从而消除该错误。修复顺序的通用建议从本仓库 website/errors/CLAUDE.md 对错误文档写作规范的约定来看推荐按以下优先级修复这类错误修复实际 bug把参数类型改对使用原生 PHP 类型声明收窄类型使用 PHPDoc 类型param、return、var收窄类型在函数体内进行类型收窄如果规则可配置再考虑调整 PHPStan 配置。对div.rightNonNumeric而言前两条即改参数类型 / 显式强转通常已足够。同类检查一套完整的运算数必须为数值规则家族div.rightNonNumeric并不是孤例。在 website/errors 目录下可以找到一整套结构完全相同的姊妹文档它们共同构成 strict-rules 的算术运算数数值性检查家族运算符左侧检查右侧检查除法/div.leftNonNumeric.mddiv.rightNonNumeric本文取模%mod.leftNonNumeric.mdmod.rightNonNumeric加法plus.leftNonNumericplus.rightNonNumeric减法-minus.leftNonNumericminus.rightNonNumeric乘法*mul.leftNonNumericmul.rightNonNumeric幂运算**pow.leftNonNumericpow.rightNonNumeric例如 mod.leftNonNumeric.md 明确写到只有int和float类型应当用于算术运算这与本文档的核心结论完全一致。当你为%、、-、*、**的某个操作数传入了bool、null、array、object等类型时PHPStan 同样会报告对应的*NonNumeric标识符修复思路与本文完全相同改对类型或者在使用前显式转换。如何在你的项目中使用错误标识符错误标识符的价值在于你可以不依赖错误消息文本而是通过稳定的标识符来精确配置忽略规则。例如在phpstan.neon中只忽略特定位置的div.rightNonNumeric而保留其它位置的同类错误parameters: ignoreErrors: - identifier: div.rightNonNumeric path: legacy/legacy_calculation.php也可以把div.rightNonNumeric等标识符整体加入基线baseline方便团队逐步清理存量代码。由于该标识符ignorable: true所有上述忽略方式都受支持。小结div.rightNonNumeric由phpstan/phpstan-strict-rules的OperandsInArithmeticDivisionRule规则报告用于捕获除法右操作数非数值bool、null、array、object等的代码这类代码在运行时可能产生意外结果严格模式下甚至抛出TypeError属于基本可以确定是逻辑错误的高置信度警告标准修复方式是修正类型声明或使用前显式强转如(int)它属于 strict-rules 覆盖、-、*、/、%、**六个运算符的*NonNumeric规则家族左侧/右侧各有一个对应标识符可参考 div.leftNonNumeric.md 等姊妹文档交叉查阅通过identifier: div.rightNonNumeric可以在ignoreErrors或基线中精确配置忽略范围。想让代码库中的算术运算更健壮直接启用phpstan/phpstan-strict-rules即可这一族规则会自动开始工作把拿布尔值做除法这类隐性 bug 拦截在运行之前。【免费下载链接】phpstanPHP Static Analysis Tool - discover bugs in your code without running it!项目地址: https://gitcode.com/gh_mirrors/ph/phpstan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

C#企业OA源码实战:SQL Server还原与权限工作流配置
C#企业OA源码实战:SQL Server还原与权限工作流配置

简介:基于C#的企业OA管理系统源码与数据库打包,适合.NET方向初学者、课程设计以及需要快速搭建办公自动化体系的开发人员。系统涵盖公共信息、个人办公、人事管理(部门信息与员工信息)、系统管理(权限、公司介绍、新闻… · 2026/9/23 5:26:16

PS通道抠图全解:原理、实操与复杂图像无痕处理
PS通道抠图全解:原理、实操与复杂图像无痕处理

前几天朋友发来一张逆光人像,碎头发几乎和灰白色的天空糊成一片,用钢笔抠了两个小时,断断续续补了快一百个锚点,边缘还是透着原来的背景色。后来我换了通道抠图,不到五分钟就把发丝完整拆了出来,叠到深色背… · 2026/9/23 5:26:16

系统架构设计核心要素与实践指南
系统架构设计核心要素与实践指南

1. 系统架构设计的本质与挑战刚入行时,我对系统架构的理解停留在技术堆砌层面,直到第一次独立负责项目才真正明白:架构设计本质上是在各种约束条件下做出的工程决策。记得当时为了赶进度,我直接照搬了前公司的技术方案&#xff0c… · 2026/9/23 5:26:10

飞书画板(lark-whiteboard)里程碑时间线图 DSL 绘制指南:从布局规则到骨架模板实战
飞书画板(lark-whiteboard)里程碑时间线图 DSL 绘制指南:从布局规则到骨架模板实战

飞书画板(lark-whiteboard)里程碑时间线图 DSL 绘制指南:从布局规则到骨架模板实战 【免费下载链接】cli The official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business dom… · 2026/9/23 6:01:10

Ceph cephadm 命令行工具完全指南:本地主机的容器化编排管理
Ceph cephadm 命令行工具完全指南:本地主机的容器化编排管理

Ceph cephadm 命令行工具完全指南:本地主机的容器化编排管理 【免费下载链接】ceph Ceph is a distributed object, block, and file storage platform 项目地址: https://gitcode.com/gh_mirrors/ce/ceph cephadm 是 Ceph 分布式存储系统中用于管理本地主机… · 2026/9/23 6:01:10

3步搞定微信公众号收费源码解析,新手避坑指南
3步搞定微信公众号收费源码解析,新手避坑指南

3步搞定微信公众号收费源码解析,新手避坑指南 官方文档里那堆XML标签和异步回调机制,看得人脑子嗡嗡响,根本抓不住重点。其实只要把 微信公众号收费 背后的源码逻辑拆解开,你会发现核心就那几个函数在跑。今天这篇 源码解析… · 2026/9/23 6:01:10

Swift 任务优先级提升 API 实战解读:SE-0462 与 withTaskPriorityEscalationHandler 完全指南
Swift 任务优先级提升 API 实战解读:SE-0462 与 withTaskPriorityEscalationHandler 完全指南

Swift 任务优先级提升 API 实战解读:SE-0462 与 withTaskPriorityEscalationHandler 完全指南 【免费下载链接】swift-evolution This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. 项目地址: https://git… · 2026/9/23 6:01:04

C++图形编程入门:用EasyX从零实现贪吃蛇游戏
C++图形编程入门:用EasyX从零实现贪吃蛇游戏

写这个项目的起因很简单:我见过太多人学C学到指针、类就放弃了,理由是“看不见摸不着”,不知道学这些东西到底能干嘛。图形编程库EasyX恰好能解决这个痛点——它能让你用熟悉的C语法,很快画出一个窗口、一个圆、一个方块&#xff… · 2026/9/23 6:01:04

8款提升程序员效率的AI工具实战指南
8款提升程序员效率的AI工具实战指南

1. 项目概述作为一名在技术行业摸爬滚打多年的老手,我深知效率工具对程序员日常工作的重要性。今天要分享的这8款AI工具,是我在过去两年里从上百个同类产品中筛选出来的真正"生产力神器"。它们覆盖了从文档创作到代码编写的全流程,… · 2026/9/23 6:01:04

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码