PHP运行抛出遇到非数值类型值警告 对应代码问题排查咨询
报错原因
- 该警告为PHP 8.0及以上版本的类型安全提示,触发原因是你代码中
($nmbr+$key)加法运算的两个变量$nmbr、$key至少有一个不是int/float数值类型,可能是字符串格式的数字、未初始化的null值、字符串文本、数组等不符合运算要求的类型,PHP无法自动完成类型转换就会抛出该警告。 - 两个不同项目的同逻辑位置都报该错误,说明这段代码是复用逻辑,两个调用场景下传入的变量都存在类型不符合预期的问题。
解决方法
方案1:快速兼容(适合确定变量本身是可转为数字的场景)
运算前强制将变量转为数值类型即可,修改对应代码如下:
// 用intval转整数,如果是浮点数值就替换为floatval if ((intval($nmbr) + intval($key)) > 52){ if (dec_to_char($nmbr)!=null){ echo dec_to_char((intval($nmbr) + intval($key)) - 52); } else { echo $nmbr; } }
方案2:类型校验兜底(适合变量来源不可控的场景)
运算前先判断变量是否为合法数值,不合法就走兜底逻辑,同时可以加日志定位问题来源:
// 先校验两个变量是否为合法数值 if (!is_numeric($nmbr) || !is_numeric($key)) { // 可加日志记录异常值,方便后续排查 // error_log("非法数值:nmbr值为".var_export($nmbr, true).",类型为".gettype($nmbr).";key值为".var_export($key, true).",类型为".gettype($key)); // 兜底逻辑可根据业务需求调整 echo $nmbr ?? ''; return; } // 校验通过后执行原有逻辑 if (($nmbr+$key)>52){ if (dec_to_char($nmbr)!=null){ echo dec_to_char(($nmbr+$key)-52); } else { echo $nmbr; } }
方案3:类型声明约束(适合这段代码为封装函数的场景)
如果这段逻辑封装在公共函数内,可以给函数参数加强制类型声明,从源头限制传入参数必须为数值类型:
// 示例:参数限定为int类型,不符合会直接抛出类型错误,更早发现问题 function your_func(int $nmbr, int $key) { // 原有逻辑 }
内容的提问来源于stack exchange,提问作者Regitta Echa
相关产品推荐
相关产品推荐

