PHP Conference Japan 2024

數值字串

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