解析错误:无效的数字文字

时间:2016-11-22 07:22:30

标签: php arrays php-7 octal

运行以下代码时出现以下错误:

代码:

<?php
    $a = array(00001, 00008, 00009, 00012);
    print_r($a);
?>

错误:

  

解析错误:数字文字无效。

为什么会出现此问题以及如何解决此问题?

4 个答案:

答案 0 :(得分:18)

这来自对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

答案 1 :(得分:0)

这是因为从0开始的所有数字都被视为八进制值,每个位置的上限为8位(0-7)。作为stated in the PHP manual,而不是默默地删除无效数字,他们现在(7.x)产生上述警告。

为什么要写这样的数字呢?如果前导零是重要的,那么它不是你拥有的数字而是一个字符串。如果您需要对它们进行计算,就好像它们是数字一样,那么在将值输出到客户端时需要添加前导零。
这可以通过printf()sprintf()完成,如下所示:

$number = 5;
printf ("%05$1d", $number);

see the manual for more examples

答案 2 :(得分:0)

有时,一个看似有效的数字文字被检测为无效的数字文字。

这是自php5.4以来的回归

您可以通过将数组更改为:

来解决此问题
$a =array(1,8,9,12);   

$a = array('0001','0008','0009','0012'); //alternative method for fix

参考:https://bugs.php.net/bug.php?id=70193

答案 3 :(得分:0)

decimal     : [1-9][0-9]*(_[0-9]+)*|0

octal       : 0[0-7]+(_[0-7]+)*

来自 document 的正则表达式,上面给出了十进制和八进制的值

在这种情况下,值为 00008,00009 也不会通过八进制或十进制的验证。由于报错,解析参数到字符串部分解决了问题。

<块引用>

注意:在 PHP 中,任何从零开始的数字都被视为八进制,但 8 和 9 不会在八进制数中使用导致抛出此错误。