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

Posted

技术标签:

【中文标题】解析错误:无效的数字文字【英文标题】:Parse error: Invalid numeric literal 【发布时间】:2017-04-05 18:43:39 【问题描述】:

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

代码:

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

错误:

为什么会出现这个问题,我该如何解决?

【问题讨论】:

我已经在PHPFiddle 上试过了,效果很好…… @d.coder 在 PHP7 中尝试一下,看看会发生什么... ;-) 是的,它在 PHP 7 中显示错误,但在 PHP 5 中没有 【参考方案1】:

这来自于 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
PHP7 与 PHP5 的示例:https://3v4l.org/GRZF2 http://php.net/manual/en/language.types.integer.php 手册:http://php.net/manual/en/migration70.incompatible.php

【讨论】:

【参考方案2】:

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

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

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

请see the manual for more examples。

【讨论】:

【参考方案3】:

有时一个明显有效的数字文字被检测为无效的数字文字。

这是自 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

【讨论】:

【参考方案4】:
decimal     : [1-9][0-9]*(_[0-9]+)*|0

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

来自document 正则表达式,用于将值视为十进制和八进制在上面给出

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

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

【讨论】:

以上是关于解析错误:无效的数字文字的主要内容,如果未能解决你的问题,请参考以下文章

解析错误无效的 XML:601

错误:无法解析提供的 SSML。提供的文本无效 SSML

解析服务器注册无效会话令牌错误

ActionScript 3 错误 JSON 解析输入无效

解决错误:作为解析器 ESLint 加载的带有无效接口的打字稿

我在 strconv.ParseFloat 中收到错误:解析“2\r”:无效语法普罗米修斯