PHP の 文字列 は、 int や float と解釈できる場合は 数値と見なされます。
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
?>
文字列が数値として評価される必要がある場合 (例: 算術演算や、int 型の宣言がある場合など) は、次のステップを踏むことで結果が決まります:
PHP_INT_MAX
で定義されています)
に含まれる場合、int に解決されます。
そうでない場合、float に解決されます。
PHP_INT_MAX
で定義されています)
に含まれる場合、int に解決されます。
そうでない場合、float に解決されます。
それに加えて、エラーレベル E_WARNING
が発生します。
PHP 8.0.0 より前のバージョンでは、 先頭に ホワイトスペースがある場合にだけ、 文字列は数値と見なされていました。 数値の後に ホワイトスペースがある場合は、 その文字列は 先頭から始まる 数値形式の文字列とみなされていました。
PHP 8.0.0 より前のバージョンでは、 文字列が数値の文脈で使われる場合、既に述べたステップと同じ処理を行いますが、 以下の違いがあります:
E_WARNING
ではなく、
E_NOTICE
が発生していました。
E_WARNING
が発生し、
0
が返されていました。
E_NOTICE
も
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 以降は TypeError。それより前は、$foo は integer (1)
$foo = 1 + "bob3"; // PHP 8.0.0 以降は TypeError。それより前は、$foo は integer (1)
$foo = 1 + "10 Small Pigs"; // PHP 8.0.0 では $foo は integer (11) で、かつ E_WARNING。それより前は E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // PHP 8.0.0 では $foo は float (14.2) で、かつ E_WARNING。それより前は E_NOTICE
$foo = "10.0 pigs " + 1; // PHP 8.0.0 では $foo は float (11) で、かつ E_WARNING。それより前は E_NOTICE
$foo = "10.0 pigs " + 1.0; // PHP 8.0.0 では $foo は float (11) で、かつ E_WARNING。それより前は E_NOTICE
?>