如果一個 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
?>