数值字符串

一个 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_NOTICE 也不会引发 E_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