如果 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
?>
在 PHP 8.0.0 之前,只有当字符串具有*前导*空格时,才认为它是数字字符串;如果它具有*尾随*空格,则该字符串被认为是前导数字字符串。
在 PHP 8.0.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
?>