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.Beispiel #1 Vergleich wissenschaftlicher Schreibweisen
<?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:
Wenn der String numerisch ist, wird er in einen
Int aufgelöst, sofern er eine ganzzahlige numerische
Zeichenkette ist und gemäß der Definition von
PHP_INT_MAX innerhalb der Grenzen des Typs
int liegt, ansonsten wird er in einen Float
aufgelöst.
Wenn der Kontext vorangestellte numerische Zeichenketten erlaubt und der
String eine solche ist, wird in einen Int
aufgelöst, sofern der vorangestellte Teil des Strings eine
ganzzahlige numerische Zeichenkette ist und gemäß der Definition von
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.
Wenn der String nicht numerisch ist, wird eine TypeError-Exception geworfen.
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:
Bei Verwendung einer führenden numerischen Zeichenkette wurde ein
E_NOTICE anstelle eines
E_WARNING ausgelöst.
Wenn die Zeichenkette nicht numerisch war, wurde ein
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
?>