【问题标题】:Issue with php parse error: Invalid numeric literalphp解析错误的问题:无效的数字文字
【发布时间】:2021-07-14 06:10:36
【问题描述】:

我有一个非常简单的 php 代码,它会根据时间回显特定的数字,但它总是指出 case 09 是问题所在。这是我的代码:

<?php

$hour = date('H');


switch ($hour) {
        //Midnight
    case 00:
        echo '1';
        // 3 AM
    case 03:
        echo '2';
        // 6 AM
    case 06:
        echo '3';
        // 9 AM    
    case 09:
        echo '4';
        // Mid-day    
    case 12:
        echo '5';
        // 3 PM    
    case 15:
        echo '6';
        // 6 PM    
    case 18:
        echo '7';
        // 9 PM    
    case 21:
        echo '8';
}

错误:PHP Parse error: Invalid numeric literal in line 17

λ php -version
PHP 7.4.16 (cli) (built: Mar  2 2021 14:06:13) ( NTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

这是一个错误吗?

【问题讨论】:

  • 当数字以前导零开头时,PHP 将其解释为八进制表示法。
  • 有什么解决方法吗?时间以整数形式给出,当我将大小写放在“..”中时,它会将其视为字符串..
  • 另外,考虑使用关联数组,而不是巨大的switch/case
  • 不,时间以字符串形式给出。
  • 现在是凌晨 4 点,使用 $hour = date('H');它会输出= 04。从我的代码中,它应该回显数字 2。没有回显

标签: php


【解决方案1】:

我希望你没事。这个错误是由于在 PHP7 中对整数(特别是八进制)的处理方式所做的更改(与 PHP5 相对应)。

您应该将它们用作字符串或实际整数。

表示您应该使用 1 而不是 01,或者如果您想使用 01,请像字符串一样使用它,例如:“01”。

<?php
$hour = date('H');
switch ($hour) {
    //Midnight
    case "00":
        echo '1'; break;
        // 3 AM
    case "03":
        echo '2'; break;
        // 6 AM
    case "06":
        echo '3'; break;
        // 9 AM    
    case "09":
        echo '4'; break;
        // Mid-day    
    case "12":
        echo '5'; break;
        // 3 PM    
    case "15":
        echo '6'; break;
        // 6 PM    
    case "18":
        echo '7'; break;
        // 9 PM    
    case "21":
        echo '8'; break;
}
?>

【讨论】:

  • 我做得很好,谢谢,错误消失了,但没有任何回应
  • 小时的值是多少?
  • 输出为 04
  • @ZackTim,你应该阅读一些关于 switch/case 的内容,显然你不明白它是如何工作的。此外,还错过了休息时间。
  • ...那是因为你忘记了休息。
【解决方案2】:

你可以找到答案

here

要么用作字符串,要么用作实际整数

  9 // Integers
 "09" // Strings

【讨论】:

  • 这里的问题是 Hour time from time 函数是这样给出的:04, 05 ...所以如果我把它作为 9 它将不匹配,因为 9 不等于 09 ,我尝试了“09”和所有其他情况,但我没有看到回声
【解决方案3】:

OP,您的代码可以简化为:

echo floor($hour / 3) + 1;

此外,您的初始代码在每个 case 部分的末尾错过了 break;,并且必须为每个 case 条件截断零(或将数字包装为字符串)。

附:您还可以使用 date('G') 代替 date('H') 来减少使用前导零造成的问题。

【讨论】:

  • 谢谢,你能解释一下你的代码吗,因为现在的输出是2,这是从哪里来的?
  • php.net 对所有核心 PHP 函数都有很好的解释。上面的代码只有一个功能,你可以在这里阅读它的描述:php.net/manual/en/function.floor.php
  • 另外,我强烈建议您阅读 php.net 上的大部分页面以了解 PHP 和类 C 编程的基础知识,因为您的问题不是针对任何具体问题,而是关于一般编程.
  • 是的,非常感谢您的宝贵时间和建议 :)
【解决方案4】:
decimal     : [1-9][0-9]*(_[0-9]+)*|0

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

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

在这种值为 09 的场景中,八进制或十进制的验证也未通过。由于给出错误,将参数解析为字符串正在部分解决问题。

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

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 2017-04-05
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多