PHP hat acht Typen, die du jeden Tag verwendest: int, float, string, bool, array, object, null und dazu callable für Funktionen, die du weitergibst. Eine Variable hat keinen festen Typ; ihr aktueller Wert hat einen. var_dump($x) zeigt Typ und Wert, und gettype($x) liefert den Typ als String.
Die erste Spalte ist gettype(), die zweite get_debug_type(). Ersetze einen Wert durch einen eigenen und führe den Code erneut aus. Bei einigen Namen sind sich die beiden uneinig: gettype sagt aus historischen Gründen integer, double und boolean, während get_debug_type die Namen aus Typdeklarationen verwendet (int, float, bool) und bei einem Objekt den Klassennamen liefert.
Die PHP-Typen im Überblick
| Typ | Beispiel | Hinweise |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | ganze Zahlen, auf modernen Systemen 64 Bit |
float | 3.14, 1.5e3 | Dezimalzahlen, ungenau wie in jeder Sprache |
string | "hi", 'hi' | eine Folge von Bytes, nicht von Zeichen |
bool | true, false | Groß- und Kleinschreibung egal (TRUE geht auch) |
array | [1, 2], ["a" => 1] | geordnete Map: Liste und Dictionary in einem |
object | new User(), new stdClass() | eine Instanz einer Klasse |
null | null | der einzige Wert des Typs null; auch „kein Wert gesetzt“ |
callable | 'strlen', fn($x) => $x * 2 | alles, was sich aufrufen lässt |
iterable | ein Array oder ein Traversable-Objekt | was foreach akzeptiert |
resource | das Ergebnis von fopen() | ein Handle auf etwas außerhalb von PHP |
Werte mit var_dump untersuchen
var_dump ist das Werkzeug, um zu sehen, was du wirklich hast. Es gibt den Typ, den Wert und bei Strings die Länge in Bytes aus:
echo würde bei den ersten drei 10 ausgeben und den Unterschied verstecken. Die Länge in string(5) "café" zählt Bytes, und deshalb unterscheiden sich strlen und mb_strlen bei Nicht-ASCII-Text.
Ganzzahlen und Floats
Eine Ganzzahl ist eine ganze Zahl. Literale dürfen zur besseren Lesbarkeit Unterstriche enthalten und in Hex-, Oktal- oder Binärschreibweise stehen. Ein Float ist jede Zahl mit Dezimalpunkt oder Exponent, und wie in jeder Sprache speichert er die meisten Dezimalzahlen nur näherungsweise:
Vergleiche Floats nie mit ==; vergleiche die Differenz mit einer kleinen Toleranz oder runde vorher beide Seiten. Für Geldbeträge speicherst du ganze Cent als Ganzzahlen.
Booleans und welche Werte false sind
Ein bool ist true oder false. Wo PHP eine Bedingung erwartet (if, while, !), wird jeder Wert in bool umgewandelt, und eine kurze Liste von Werten zählt als false: false, 0, 0.0, "", "0", [] und null. Alles andere ist true. Die Tabelle zeigt jeden Wert mit seinem Typ, seiner Umwandlung in bool und ob er numerisch ist:
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | |||
| 1 | |||
| -1 | |||
| 0.0 | |||
| 1.5 | |||
| "0" | |||
| "" | |||
| " " | |||
| "0.0" | |||
| "10" | |||
| "1e1" | |||
| "abc" | |||
| "null" | |||
| true | |||
| false | |||
| null | |||
| [] | |||
| [0] |
Die Überraschungen sind "0.0", " " und "null": Alle drei sind nicht leere Strings und nicht "0", also sind sie true, und if ($value) führt für sie den Rumpf aus.
Arrays, Objekte und null
Ein Array enthält eine beliebige Mischung von Werten unter Ganzzahl- oder String-Schlüsseln. Ein Objekt ist eine Instanz einer Klasse; stdClass ist PHPs leere Klasse für schnelle Objekte, und (object) macht aus einem Array ein Objekt. null bedeutet „kein Wert“:
Einen Typ mit is_*-Funktionen prüfen
Für jeden Typ gibt es eine Testfunktion, die true oder false zurückgibt. is_numeric ist etwas anderes als is_int: Es akzeptiert auch numerische Strings, und genau das willst du beim Prüfen von Formulareingaben.
Weitere: is_bool, is_array, is_object, is_null, is_callable, is_iterable und $x instanceof ClassName für eine bestimmte Klasse.
Typumwandlung und strikte Typen
PHP wandelt Typen automatisch um, wenn ein Operator einen anderen braucht. Ein numerischer String in einer Rechnung wird zur Zahl, und . macht aus Zahlen Strings. Ein String, der gar nicht numerisch ist, lässt sich nicht addieren, und PHP 8 wirft einen TypeError:
Typisierte Parameter wandeln ebenfalls um, außer die Datei beginnt mit declare(strict_types=1);. Dann schlägt ein Aufruf mit dem falschen skalaren Typ fehl, statt umgewandelt zu werden:
Um bewusst umzuwandeln, castest du: (int) "42", (float) "3.5", (string) 10, (bool) "0". Die Seite zu Type Casting behandelt jeden Cast und seine Sonderfälle.
Typischer Fehler: verschiedene Typen mit == vergleichen
Weil == vor dem Vergleich umwandelt, können zwei Werte verschiedener Typen auf eine Weise „gleich“ sein, die zu Bugs führt, etwa "1e1" == "10" (beides ist die Zahl 10) oder null == false. Verwende ===, das zusätzlich denselben Typ verlangt, außer du willst die Umwandlung:
PHP 8 hat den schlimmsten Fall behoben: "abc" == 0 war früher true und ist jetzt false, weil ein nicht numerischer String als String verglichen wird. Die vollständigen Tabellen stehen auf der Seite zu Vergleichsoperatoren.
Häufig gestellte Fragen
Wie prüfe ich den Typ einer Variable in PHP?
var_dump($x) gibt Typ und Wert aus, zum Beispiel int(5). gettype($x) liefert den Typnamen als String ("integer"), und get_debug_type($x) liefert den modernen Namen ("int" oder bei Objekten den Klassennamen). Um auf einen bestimmten Typ zu testen, verwendest du is_int, is_string, is_array und die anderen is_*-Funktionen.
Warum liefert gettype bei einem Float "double"?
Aus historischen Gründen meldet gettype() Floats als "double" und Ganzzahlen als "integer". get_debug_type(), eingeführt in PHP 8, liefert "float" und "int", also dieselben Namen, die du in Typdeklarationen schreibst.
Welche Werte sind in PHP false?
In bool umgewandelt sind diese Werte false: false, 0, 0.0, "", "0", [] und null. Alles andere ist true, auch "0.0", " " und "false".
Was ist die größte Ganzzahl in PHP?
PHP_INT_MAX, auf 64-Bit-Systemen 9223372036854775807. Wenn du darüber hinaus addierst, gibt es keinen Überlauf zum Anfang: Das Ergebnis wird ein Float und verliert Genauigkeit.
Ist PHP stark oder schwach typisiert?
PHP ist dynamisch typisiert und wandelt Typen standardmäßig um, wenn es kann ("10" + 5 ist 15). Mit declare(strict_types=1); am Anfang einer Datei lehnen Aufrufe typisierter Funktionen in dieser Datei falsche skalare Typen mit einem TypeError ab, statt sie umzuwandeln.