如果一個(gè) PHP string 可以被解釋為 int 或 float 類(lèi)型,則它被視為數字字符串。
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 也有前導數字字符串的概念。 這只是一個(gè)字符串,其開(kāi)頭類(lèi)似于數字字符串,后跟任何字符。
當一個(gè) string 需要被當作一個(gè)數字計算時(shí),(例如:算術(shù)運算, int 類(lèi)型聲明等),則采取以下步驟來(lái)確定結果:
PHP_INT_MAX
定義),則解析為 int ,否則解析為 float 。
此外,還會(huì )導致 E_WARNING
級別的錯誤。
在 PHP 8.0.0 之前, 只有在前導空格的時(shí)候,string 才被認為是數字;如果它有尾隨空格,則該字符串被視為是前導數字。
在 PHP 8.0.0 之前,當在數字上下文中使用字符串時(shí),它將執行與上述相同的步驟,但有以下區別:
E_NOTICE
而不是 E_WARNING
錯誤。
E_WARNING
錯誤并返回 0
。
E_NOTICE
,也不會(huì )導致 E_WARNING
。
<?php
$foo = 1 + "10.5"; // $foo 是 float (11.5)
$foo = 1 + "-1.3e3"; // $foo 是 float (-1299)
$foo = 1 + "bob-1.3e3"; // PHP 8.0.0 起產(chǎn)生 TypeError;在此之前 $foo 是 integer (1)
$foo = 1 + "bob3"; // PHP 8.0.0 起產(chǎn)生 TypeError;在此之前 $foo 是 integer (1)
$foo = 1 + "10 Small Pigs"; // PHP 8.0.0 起,$foo 是 integer (11),并且產(chǎn)生 E_WARNING;在此之前產(chǎn)生 E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // PHP 8.0.0 起,$foo 是 float (14.2),并且產(chǎn)生 E_WARNING;在此之前產(chǎn)生 E_NOTICE
$foo = "10.0 pigs " + 1; // PHP 8.0.0 起,$foo 是 float (11),并且產(chǎn)生 E_WARNING;在此之前產(chǎn)生 E_NOTICE
$foo = "10.0 pigs " + 1.0; // PHP 8.0.0 起,$foo 是 float (11),并且產(chǎn)生 E_WARNING;在此之前產(chǎn)生 E_NOTICE
?>