In PHP gilt eine Zeichenkette (Typ string) als numerisch, wenn er als Ganzzahl (int) oder Gleitkommazahl (float) interpretiert werden kann.
Formal seit 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})
In PHP gibt es auch das Konzept der vorangestellten numerischen Zeichenkette. Dies ist einfach eine Zeichenkette, die wie eine numerische Zeichenkette beginnt, auf die beliebige Zeichen folgen.
Hinweis:
Jede Zeichenkette, die den Buchstaben
E
(Groß- und Kleinschreibung wird nicht berücksichtigt) enthält, wird als Zahl in wissenschaftlicher Notation betrachtet. Dies kann zu unerwarteten Ergebnissen führen.<?php
var_dump("0D1" == "000"); // false, "0D1" ist keine wissenschaftliche Schreibweise
var_dump("0E1" == "000"); // true, "0E1" ist 0 * (10 ^ 1) also 0
var_dump("2E1" == "020"); // true, "2E1" ist 2 * (10 ^ 1) also 20
?>
Wenn ein Wert vom Typ string als Zahl ausgewertet werden muss (z. B. arithmetische Operationen, Deklaration des Typs int usw.), werden die folgenden Schritte durchgeführt, um das Ergebnis zu ermitteln:
PHP_INT_MAX
innerhalb der Grenzen des Typs
int liegt, ansonsten wird er in einen Float
aufgelöst.
PHP_INT_MAX
innerhalb der Grenzen des Typs
int liegt, ansonsten wird in einen Float
aufgelöst. Darüber hinaus wird ein Fehler der Stufe
E_WARNING
ausgelöst.
Vor PHP 8.0.0 galt ein String nur dann als numerisch, wenn er ein vorangestelltes Leerzeichen enthielt. Wenn er ein nachgestelltes Leerzeichen enthielt, wurde er als vorangestellt numerisch betrachtet.
Wenn vor PHP 8.0.0 eine Zeichenkette in einem numerischen Kontext verwendet wurde, wurden die gleichen Schritte wie oben beschrieben durchgeführt, mit den folgenden Unterschieden:
E_NOTICE
anstelle eines
E_WARNING
ausgelöst.
E_WARNING
ausgelöst und der Wert
0
zurückgegeben.
E_NOTICE
noch
E_WARNING
ausgelöst.
<?php
$foo = 1 + "10.5"; // $foo ist vom Typ float (11.5)
$foo = 1 + "-1.3e3"; // $foo ist vom Typ float (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError seit PHP 8.0.0; davor ist $foo vom Typ integer (1)
$foo = 1 + "bob3"; // TypeError seit PHP 8.0.0; davor ist $foo vom Typ integer (1)
$foo = 1 + "10 Small Pigs"; // $foo ist vom Typ integer (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo ist vom Typ float (14.2) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = "10.0 pigs " + 1; // $foo ist vom Typ float (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo ist vom Typ float (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
?>