## 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.

### Zeichenketten-Kontext

Dieser Kontext liegt vor, wenn echo, print, Zeichenketten-Interpolation, oder der Verkettungsoperator für Zeichenketten verwendet werden.

In diesem Kontext wird der Wert als String interpretiert. Wenn der Wert nicht interpretiert werden kann, wird ein TypeError geworfen. Vor PHP 7.4.0 wurde ein `E_RECOVERABLE_ERROR` ausgelöst.

### 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.

### Vergleichender Kontext

Dieser Kontext liegt vor, wenn ein Vergleichsoperator verwendet wird.

Die in diesem Zusammenhang auftretenden Typumwandlungen werden in der Tabelle Vergleich mit verschiedenen Typen erläutert.

### 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:

1. int
2. float
3. string
4. 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.

Beispiel #2 Typumwandlung

`<?php
$foo = 10; // $foo ist ein Integer
$bar = (bool) $foo; // $bar ist ein Boolean
var_dump($bar);
?>`

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 7.4.0 veraltet und wurde in PHP 8.0.0 entfernt.

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:

> `<?php
> $foo = (int) $bar;
> $foo = ( int ) $bar;
> ?>`

Umwandlung literaler Strings und Variablen in binäre Strings:

`<?php
$binary = (binary) $string;
$binary = b"binary string";
?>`

Anstatt eine Variable in einen String umzuwandeln, kann die Variable auch in doppelte Anführungszeichen gesetzt werden.

Beispiel #3 Verschiedene Casting-Mechanismen

`<?php
$foo = 10; // $foo ist eine ganze Zahl
$str = "$foo"; // $str ist eine Zeichenkette
$fst = (string) $foo; // $fst ist ebenfalls eine Zeichenkette
// Dies gibt aus "sie sind identisch"
if ($fst === $str) {
echo "sie sind identisch", PHP_EOL;
}
?>`

In den folgenden Abschnitten wird beschrieben, was genau passiert, wenn zwischen bestimmten Typen umgewandelt wird:

- Umwandlung in boolean
- Umwandlung in integer
- Umwandlung in float
- Umwandlung in string
- Umwandlung in array
- Umwandlung in ein Objekt
- Umwandlung in eine Ressource
- Umwandlung in NULL
- Die Tabellen zu Typenvergleichen

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

> Beispiel #4 Verwenden des Array-Offsets bei einer Zeichenkette

> `<?php
> $a = 'car'; // $a ist eine Zeichenkette
> $a[0] = 'b'; // $a ist immer noch eine Zeichenkette
> echo $a; // bar
> ?>`
> Weitere Informationen sind im Abschnitt Zugriff auf Zeichen in einem String zu finden.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open