數(shù)字字符串

如果一個(gè) PHP string 可以被解釋為 intfloat 類型,則它被視為數(shù)字字符串。

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 也有前導(dǎo)數(shù)字字符串的概念。 這只是一個(gè)字符串,其開頭類似于數(shù)字字符串,后跟任何字符。

在數(shù)字上下文中使用的字符串

當(dāng)一個(gè) string 需要被當(dāng)作一個(gè)數(shù)字計(jì)算時(shí),(例如:算術(shù)運(yùn)算, int 類型聲明等),則采取以下步驟來確定結(jié)果:

  1. 如果 string 是數(shù)字,當(dāng) string 是整數(shù)字符串并且符合 int 類型的范圍限制(即是 PHP_INT_MAX 定義的值),則解析為 int ,否則解析為 float 。
  2. 如果上下文允許前導(dǎo)數(shù)字和一個(gè) string,如果 string 的前導(dǎo)部分是整數(shù)數(shù)字字符串且符合 int 類型限制(由 PHP_INT_MAX 定義),則解析為 int ,否則解析為 float 。 此外,還會(huì)導(dǎo)致 E_WARNING 級別的錯(cuò)誤。
  3. 如果 string 不是數(shù)字,則會(huì)拋出一個(gè) TypeError 的異常。

PHP 8.0.0 之前的行為

在 PHP 8.0.0 之前, 只有在前導(dǎo)空格的時(shí)候,string 才被認(rèn)為是數(shù)字;如果它有尾隨空格,則該字符串被視為是前導(dǎo)數(shù)字。

在 PHP 8.0.0 之前,當(dāng)在數(shù)字上下文中使用字符串時(shí),它將執(zhí)行與上述相同的步驟,但有以下區(qū)別:

  • 使用前導(dǎo)數(shù)字字符串將導(dǎo)致 E_NOTICE 而不是 E_WARNING 錯(cuò)誤。
  • 如果字符串不是數(shù)字,則會(huì)導(dǎo)致 E_WARNING 錯(cuò)誤并返回 0
在 PHP 7.1.0 之前,則既不會(huì)導(dǎo)致 E_NOTICE,也不會(huì)導(dǎo)致 E_WARNING。

<?php
$foo 
"10.5";                // $foo 是 float (11.5)
$foo "-1.3e3";              // $foo 是 float (-1299)
$foo "bob-1.3e3";           // PHP 8.0.0 起產(chǎn)生 TypeError;在此之前 $foo 是 integer (1)
$foo "bob3";                // PHP 8.0.0 起產(chǎn)生 TypeError;在此之前 $foo 是 integer (1)
$foo "10 Small Pigs";       // PHP 8.0.0 起,$foo 是 integer (11),并且產(chǎn)生 E_WARNING;在此之前產(chǎn)生 E_NOTICE
$foo "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
?>