PHP新手遇非规范数值报错(FeePayment.php第145行)求解决
问题根因
报错的核心原因是 $months_diff 变量实际存储的是带文本的字符串,而非纯数字值,直接进行算术运算触发了类型警告。
你调用 $interval->format('%m months') 时,返回的结果类似 2 months 这种带后缀的字符串,PHP在执行 $months_diff+1 时尝试把字符串转成数字失败,就抛出了对应的Notice。
修复方案
- 提取纯数字的月份差值
不要在format参数里加months后缀,直接用%m参数获取纯数字的月份差,还可以强制转成int类型避免后续隐式转换问题,同时删除无意义的空执行format语句:
$datetime1 = new DateTime($orderdate); $datetime2 = new DateTime($currdate); $interval = date_diff($datetime1, $datetime2); // 原无效代码直接删除 $interval->format('%m months'); // 修复后的写法,获取纯数字月份差 $months_diff = (int)$interval->format('%m'); // 后续循环逻辑可以正常执行 for($i = 1; $i <=($months_diff+1); $i++){ $totalFees = $fees + $totalFees;
- 补充兼容优化
- 如果你的日期间隔可能超过1年,
DateInterval的%m仅会返回不满1年的月份数,需要额外累加年份对应的月份数:
$months_diff = (int)$interval->format('%m') + (int)$interval->format('%y') * 12;
- 建议初始化
$totalFees变量为0,避免第一次累加时出现未定义变量的警告。
内容的提问来源于stack exchange,提问作者Kojo Yeboah
相关产品推荐
相关产品推荐

