PHP7.2公历转伊斯兰回历出现非数值警告的修复咨询
解决PHP7.2下公历转伊斯兰回历的"non-numeric value encountered"警告
这个警告的核心原因是PHP7.0+对变量类型的检查变得更严格,而PHP5会自动隐式将字符串形式的数字转换为数值类型参与运算,不会抛出警告。你的代码里从explode拆分出来的日期值都是字符串类型,在PHP7.2中直接参与数学运算就会触发这个警告。
具体修复步骤
1. 强制转换日期拆分后的变量为整数类型
在拆分日期后,立刻将$day、$month、$year转为整数,这是最根本的修复:
1510 $date = "25/1/1999"; 1511 $Gdate = explode ('/', $date) ; 1512 $day = (int)$Gdate[0]; // 强制转为整数 1513 $month = (int)$Gdate[1]; 1514 $year = (int)$Gdate[2];
之前你尝试的intval无效,大概率是只转换了部分变量,或者转换时机不对——在变量初始化时就完成类型转换,能避免后续所有运算的类型问题。
2. 优化整数除法逻辑(可选但推荐)
PHP7+新增了intdiv函数,专门用于整数除法,比floor($x/100.)更直观且避免float类型的潜在问题:
// 替换第1524行 1524 $c = intdiv($y, 100); // 替换第1527行的floor($c/4.) 1527 if($y>1582) {$jgc=2-$c+intdiv($c,4);}
3. 确保所有运算变量为数值类型
经过上面的修改后,第1529行的$jd计算中,所有参与运算的变量($y、$m、$day、$jgc)都会是整数或合法的数值类型,警告自然会消失。
修改后的完整核心代码片段
1510 $date = "25/1/1999"; 1511 $Gdate = explode ('/', $date) ; 1512 $day = (int)$Gdate[0]; 1513 $month = (int)$Gdate[1]; 1514 $year = (int)$Gdate[2]; 1516 $jgc=0; 1517 $m=$month; 1518 $y=$year; 1519 if($m<3) 1520 { 1521 $m=$m+12; 1522 $y=$y-1; 1523 } 1524 $c = intdiv($y, 100); 1526 if($y==1582 && $m>10) {$jgc=10;} 1527 if($y>1582) {$jgc=2-$c+intdiv($c,4);} 1529 $jd= floor(365.25*($y+4716))+floor(30.6001*($m+1))+$day+$jgc-1524;
为什么这个方案有效?
PHP7.2不再容忍字符串与数值的隐式混合运算,明确变量类型后,所有数学操作都在合法的数值类型间进行,既消除了警告,也让代码的类型逻辑更清晰,符合PHP现代版本的编码规范。
内容的提问来源于stack exchange,提问作者Quest
相关产品推荐
相关产品推荐

