语法解析错误:无效的数字字面值。

26

在运行以下代码时,我遇到了以下错误:

代码:

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

错误:

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

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


我已经在PHPFiddle上尝试过了,它运行得很好... - d.coder
3
尝试在PHP7中执行并看看会发生什么...;-) - Qirel
是的,在PHP 7中显示错误,但在PHP 5中没有。 - Rana Ghosh
4个回答

33

这源于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

6
这是因为以0开头的数字被视为八进制值,每个位置(0-7)有8位数的上限。正如PHP手册中所述,7.x版本不再默默地删除无效数字,而会产生上述警告。
但是您为什么要这样写数字呢?如果前导零是有意义的,那么你手上拿的不是数字,而是字符串。如果您需要对它们进行计算,则需要在将值输出到客户端时添加前导零。
可以使用printf()sprintf()来完成,像这样:
$number = 5;
printf ("%05$1d", $number);

参考手册获取更多示例

PHP的date('m') = 07。在八月,date('m')将会是08。if(date('m') == 08){}会导致上述错误。 - TARKUS

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


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

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

文档中可以看到将值视为十进制和八进制的正则表达式如上所示。

在这种情况下,值为00008、00009无法通过八进制或十进制验证。由于出现错误,将参数解析为字符串部分地解决了问题。

注意:在PHP中,任何以零开头的数字都被视为八进制,但8和9不会用于八进制数,因此会引发此错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接