在运行以下代码时,我遇到了以下错误:
代码:
<?php
$a = array(00001, 00008, 00009, 00012);
print_r($a);
?>
错误:
解析错误:数字文字无效。
为什么会出现此问题,如何解决?
这源于PHP7中针对整数特别是八进制数处理方式的更改(相较于PHP5)。
根据文档(PHP7迁移文档)
非法八进制文字
之前,包含无效数字的八进制文字会被静默地截断(0128被视为012)。现在,一个非法的八进制文字会导致解析错误。
根据整数文档
在PHP 7之前,如果八进制整数中包含无效数字(如8或9),则其余数字将被忽略。自从PHP 7后,会产生解析错误。
使用它们作为字符串或实际整数。
$a = array(1, 8, 9, 12); // Integers
$a = array("00001", "00008", "00009", "00012"); // Strings
printf()
或sprintf()
来完成,像这样:$number = 5;
printf ("%05$1d", $number);
if(date('m') == 08){}
会导致上述错误。 - TARKUS$a =array(1,8,9,12);
$a = array('0001','0008','0009','0012'); //alternative method for fix
decimal : [1-9][0-9]*(_[0-9]+)*|0
octal : 0[0-7]+(_[0-7]+)*
从文档中可以看到将值视为十进制和八进制的正则表达式如上所示。
在这种情况下,值为00008、00009无法通过八进制或十进制验证。由于出现错误,将参数解析为字符串部分地解决了问题。
注意:在PHP中,任何以零开头的数字都被视为八进制,但8和9不会用于八进制数,因此会引发此错误。