PHP Conference Nagoya 2025

Numerische Zeichenketten

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
?>

Zeichenketten, die im numerischen Kontext verwendet werden

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:

  1. 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.
  2. 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.
  3. Wenn der String nicht numerisch ist, wird eine TypeError-Exception geworfen.

Verhalten vor PHP 8.0.0

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.
Vor PHP 7.1.0 wurde weder 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
?>
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top