2024 年 PHP 日本大会

数字字符串

如果 PHP 的字符串可以解释为整数浮点数,则认为它是数字字符串。

正式定义自 PHP 8.0.0 起

WHITESPACES      \s*
LNUM             [0-9]+
DNUM             ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM    (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING   {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING       ({INT_NUM_STRING} | {FLOAT_NUM_STRING})

PHP 还具有 *前导* 数字字符串的概念。这只是一个字符串,它以数字字符串开头,后跟任何字符。

注意:

任何包含字母 E(不区分大小写)并被数字包围的字符串都将被视为以科学记数法表示的数字。这可能会产生意想不到的结果。

<?php
var_dump
("0D1" == "000"); // false,"0D1" 不是科学记数法
var_dump("0E1" == "000"); // true,"0E1" 等于 0 * (10 ^ 1),或 0
var_dump("2E1" == "020"); // true,"2E1" 等于 2 * (10 ^ 1),或 20
?>

在数字上下文中的字符串

当需要将字符串评估为数字(例如算术运算,整数类型声明等)时,将采取以下步骤来确定结果

  1. 如果字符串是数字,如果字符串是整数数字字符串并且适合整数类型的限制(由PHP_INT_MAX定义),则解析为整数,否则解析为浮点数
  2. 如果上下文允许前导数字字符串并且字符串是其中之一,如果字符串的前导部分是整数数字字符串并且适合整数类型的限制(由PHP_INT_MAX定义),则解析为整数,否则解析为浮点数。此外,还会引发级别为E_WARNING的错误。
  3. 字符串不是数字,则抛出TypeError

PHP 8.0.0 之前的行为

在 PHP 8.0.0 之前,只有当字符串具有*前导*空格时,才认为它是数字字符串;如果它具有*尾随*空格,则该字符串被认为是前导数字字符串。

在 PHP 8.0.0 之前,当字符串用于数字上下文时,它将执行与上述相同的步骤,但以下区别:

  • 使用前导数字字符串将引发E_NOTICE而不是E_WARNING
  • 如果字符串不是数字,则会引发E_WARNING,并返回值 0
在 PHP 7.1.0 之前,不会引发E_NOTICEE_WARNING

<?php
$foo
= 1 + "10.5"; // $foo 为浮点数 (11.5)
$foo = 1 + "-1.3e3"; // $foo 为浮点数 (-1299)
$foo = 1 + "bob-1.3e3"; // PHP 8.0.0 起为 TypeError,之前 $foo 为整数 (1)
$foo = 1 + "bob3"; // PHP 8.0.0 起为 TypeError,之前 $foo 为整数 (1)
$foo = 1 + "10 Small Pigs"; // $foo 为整数 (11),PHP 8.0.0 中会引发 E_WARNING,之前为 E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo 为浮点数 (14.2),PHP 8.0.0 中会引发 E_WARNING,之前为 E_NOTICE
$foo = "10.0 pigs " + 1; // $foo 为浮点数 (11),PHP 8.0.0 中会引发 E_WARNING,之前为 E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo 为浮点数 (11),PHP 8.0.0 中会引发 E_WARNING,之前为 E_NOTICE
?>
添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top