Typumwandlung (Typen-Jonglage)
PHP verlangt in der Variablendeklaration keine explizite Typdefinition. Der
Typ einer Variablen wird in diesem Fall durch den Wert bestimmt, der in ihr
gespeichert wird. Das heißt, wenn der Variable $var der
Typ string zugewiesen wird, dann ist $var
vom Typ string. Wenn $var anschließend ein
Wert vom Typ int zugewiesen wird, ist sie vom Typ
int.
PHP kann je nach Kontext versuchen, den Typ eines Wertes automatisch in
einen anderen umzuwandeln. Folgende Kontexte gibt es:
-
Numerisch
-
Zeichenkette
-
Logisch
-
Ganzzahlig und Zeichenkette
-
Vergleichend
-
Funktion
Hinweis:
Wenn ein Wert als ein anderer Typ interpretiert werden muss, wird der Typ
des Wertes selbst nicht geändert.
Um zu erzwingen, dass eine Variable als ein bestimmter Typ ausgewertet wird,
siehe den Abschnitt über
Explizite Typumwandlung (Type-Casting).
Um den Typ einer Variablen zu ändern, siehe die Funktion
settype().
Numerischer Kontext
Dieser Kontext liegt vor, wenn ein
arithmetischer Operator
verwendet wird.
Wenn in diesem Kontext einer der beiden Operanden vom Typ float
ist (oder nicht als Int interpretiert werden kann), werden
beide Operanden als Floats interpretiert, und das Ergebnis ist
vom Typ float. Andernfalls werden die Operanden als
Ints interpretiert, und das Ergebnis ist ebenfalls vom Typ
int. Wenn einer der Operanden nicht interpretiert werden kann,
wird seit PHP 8.0.0 ein TypeError geworfen.
Logischer Kontext
Dieser Kontext liegt vor, wenn bedingte Anweisungen, der
ternäre Operator
oder ein logischer Operator
verwendet werden.
In diesem Kontext wird der Wert als Bool interpretiert.
Kontext für ganzzahlige Werte und Zeichenketten
Dieser Kontext liegt vor, wenn
bitweise Operatoren
verwendet werden.
Wenn in diesem Kontext alle Operanden vom Typ string sind, ist
auch das Ergebnis vom Typ string. Andernfalls werden die
Operanden als Ints interpretiert, und das Ergebnis ist
ebenfalls vom Typ int. Wenn einer der Operanden nicht
interpretiert werden kann, wird seit PHP 8.0.0 ein
TypeError geworfen.
Funktionskontext
Dieser Kontext liegt vor, wenn ein Wert an einen typisierten Parameter oder
eine Eigenschaft übergeben oder von einer Funktion zurückgegeben wird, die
einen Rückgabetyp deklariert.
In diesem Kontext muss der Wert ein Wert dieses Typs sein. Hiervon gibt es
zwei Ausnahmen. Die Erste: Wenn der Wert vom Typ int ist und
der deklarierte Typ ist float, dann wird die Ganzzahl in eine
Gleitkommazahl umgewandelt. Die Zweite: Wenn der deklarierte Typ ein
skalarer Typ ist,
der Wert in einen skalaren Typ umgewandelt werden kann und der
Modus der zwangsweisen Typisierung aktiv ist (Standard), kann der Wert in
einen akzeptierten skalaren Wert umgewandelt werden. Siehe unten für eine
Beschreibung dieses Verhaltens.
Warnung
Interne Funktionen wandeln
null
automatisch in skalare Typen um. Dieses Verhalten ist seit
PHP 8.1.0 DEPRECATED (veraltet).
Automatische Typisierung mit einfachen Typdeklarationen
-
Deklaration des Typs bool: Der Wert wird als
bool interpretiert.
-
Deklaration des Typs int: Der Wert wird als
int interpretiert, wenn die Umwandlung wohldefiniert ist,
z. B. wenn die Zeichenkette
numerisch ist.
-
Deklaration des Typs float: Der Wert wird als
float interpretiert, wenn die Umwandlung wohldefiniert ist,
z. B. wenn die Zeichenkette
numerisch ist.
-
Deklaration des Typs string: Der Wert wird als
string interpretiert.
Automatische Typisierung mit Union-Typen
Wenn strict_types
nicht aktiviert ist, unterliegen
skalare Typdeklarationen einer begrenzten impliziten Typumwandlung. Wenn
der genaue Typ des Wertes nicht Teil der Union ist, wird der Zieltyp in der
folgenden Reihenfolge gewählt:
-
int
-
float
-
string
-
bool
Wenn der Typ in der Union existiert und der Wert gemäß der PHP-Semantik
zur Typüberprüfung in diesen Typ umgewandelt werden kann, wird dieser Typ
ausgewählt. Andernfalls wird der nächste Typ geprüft.
Achtung
Wenn es sich bei dem Wert um eine Zeichenkette handelt und sowohl int als
auch float Teil der Union sind, wird der bevorzugte Typ durch die
bestehende Semantik
numerischer Zeichenketten
bestimmt. Zum Beispiel wird für "42"
int
gewählt, während für "42.0"
float
gewählt wird.
Hinweis:
Typen, die nicht in der obigen Präferenzliste aufgeführt sind, kommen als
Ziele für implizite Umwandlungen nicht in Frage. Insbesondere gibt es
keine impliziten Umwandlungen in die Typen null,
false und true.
Beispiel #1 Beispiel für Typen, die in einen Typ umgewandelt werden, der Teil einer Union ist
<?php
// int|string
42 --> 42 // exakter Typ
"42" --> "42" // exakter Typ
new ObjectWithToString --> "Result of __toString()"
// object nicht kompatibel mit int, greift auf string zurück
42.0 --> 42 // float kompatibel mit int
42.1 --> 42 // float kompatibel mit int
1e100 --> "1.0E+100" // float zu groß für Typ int, greift auf string zurück
INF --> "INF" // float zu groß für Typ int, greift auf string zurück
true --> 1 // bool kompatibel mit int
[] --> TypeError // array nicht kompatibel mit int oder string
// int|float|bool
"45" --> 45 // Zeichenkette im numerischen Format für int
"45.0" --> 45.0 // Zeichenkette im numerischen Format für float
"45X" --> true // keine numerische Zeichenkette, greift auf bool zurück
"" --> false // keine numerische Zeichenkette, greift auf bool zurück
"X" --> true // keine numerische Zeichenkette, greift auf bool zurück
[] --> TypeError // array nicht kompatibel mit int, float oder bool
?>
Explizite Typumwandlung (Type-Casting)
Typ-Casting wandelt den Wert in einen bestimmten Typ um, indem der Typ in
Klammern vor den umzuwandelnden Wert geschrieben wird.
Folgende Umwandlungen sind erlaubt:
(int)
- Umwandlung in int
(bool)
- Umwandlung in bool
(float)
- Umwandlung in float
(string)
- Umwandlung in string
(array)
- Umwandlung in array
(object)
- Umwandlung in object
(unset)
- Umwandlung in NULL
Hinweis:
(integer)
ist ein Alias des (int)
-Casts.
(boolean)
ist ein Alias des (bool)
-Casts.
(binary)
ist ein Alias des (string)
-Casts.
(double)
und (real)
sind Aliase des
(float)
-Casts.
Da diese Casts nicht den kanonischen Typnamen verwenden, werden sie nicht
empfohlen.
Warnung
Der Cast-Alias (real)
ist seit PHP 8.0.0 veraltet.
Warnung
Der (unset)
-Cast ist seit PHP 7.2.0 veraltet und wurde
in PHP 8.0.0 entfernt. Es ist zu beachten, dass der
(unset)
-Cast gleichbedeutend ist mit der Zuweisung des
Wertes NULL an eine Variable oder einen Aufruf.
Achtung
Der (binary)
-Cast und das Präfix b
existieren im Hinblick auf zukünftige Versionen. Derzeit sind
(binary)
und (string)
identisch,
aber weil sich dies in Zukunft ändern könnte, sollte man sich nicht darauf
verlassen.
Hinweis:
Leerzeichen werden innerhalb der Klammern eines Casts ignoriert, weshalb
die beiden folgenden Ausdrücke gleichwertig sind:
Hinweis:
Anstatt eine Variable in einen String umzuwandeln, kann die
Variable auch in doppelte Anführungszeichen gesetzt werden.
In den folgenden Abschnitten wird beschrieben, was genau passiert, wenn
zwischen bestimmten Typen umgewandelt wird:
Hinweis:
Da Strings in PHP mit derselben Syntax wie
Arrays über Offsets indiziert werden können, gilt das
folgende Beispiel für alle PHP-Versionen:
Weitere Informationen sind im Abschnitt
Zugriff auf Zeichen in einem String
zu finden.