mitmario.dev

Typen ansehen

PHP Sandbox 4 Min Lesezeit 4 BeispieleLektion 4 von 7

In Lektion 2.1 stand, dass PHP dir nicht abverlangt, die Sorte eines Wertes anzukündigen. Das ist bequem und hat einen Preis: Man sieht einer Zeile nicht an, was in ihr steckt.

Bisher konntest du damit leben. Seit der letzten Lektion nicht mehr, denn dort haben zwei Zeilen einander widersprochen und du hattest kein Werkzeug, um nachzusehen, wer recht hat. Das holen wir jetzt nach.

Warum echo hier nicht weiterhilft

echo hat genau eine Aufgabe: aus einem Wert Text machen und ihn ausgeben. Das tut es zuverlässig, und dabei geht die Information verloren, die du gerade suchst.

echo macht aus allem Text
<?php

$alsZahl = 42;
$alsText = "42";
$alsBruch = 42.0;

echo "alsZahl:  $alsZahl\n";
echo "alsText:  $alsText\n";
echo "alsBruch: $alsBruch\n";

Drei Variablen, drei verschiedene Sorten, und auf dem Bildschirm stehen dreimal dieselben zwei Ziffern. Die 42.0 verliert dabei sogar ihre Null: Hinter dem Punkt steht nichts, was der Rede wert wäre, und echo schreibt nur, was zählt.

Das ist kein Fehler, das ist die Aufgabe von echo. Für unsere Frage brauchen wir etwas anderes.

Eines davon hast du schon: Der Reiter Debug hält die Sorten auseinander. Nach Aufzeichnen steht dort alsZahl=42, alsText="42" und alsBruch=42.0. Text bekommt Anführungszeichen, eine gebrochene Zahl behält ihre Nachkommastelle, und nur die ganze Zahl steht nackt da. Für einen Blick zwischendurch reicht das. Für ein Programm, das die Antwort selbst ausgeben soll, brauchst du trotzdem ein Werkzeug im Code.

var_dump zeigt den Wert ungeschönt

var_dump() ist das Werkzeug, das du in PHP am häufigsten benutzen wirst. Es nimmt einen Wert und schreibt auf, was wirklich darin steckt.

var_dump sagt, was wirklich drinsteht
<?php

var_dump("Mia");
var_dump(42);
var_dump(42.0);
var_dump(true);
var_dump(null);
var_dump("Köln");

Lies eine Zeile von links nach rechts: zuerst die Sorte, dann in Klammern eine Zusatzangabe, dann der Wert. string(3) "Mia" heißt also: Text, Länge 3, und zwar Mia. Bei int(42) und float(42) steht keine Klammerangabe mit Länge, dort ist die Zahl schon alles. bool(true) und NULL bekommen in der nächsten Lektion ihren eigenen Auftritt, hier zählt nur, dass var_dump sie dir überhaupt nennt.

Die letzte Zeile ist ein Wiedersehen: "Köln" hat vier Buchstaben, aber var_dump sagt string(5). Diese Zahl zählt Bytes und keine Zeichen, genau wie strlen aus Lektion 2.2. Wundere dich also nicht über Längen, die um ein paar zu hoch aussehen, das sind deine Umlaute.

Drei Dinge noch, die du im Alltag brauchst. var_dump schreibt auf die Ausgabe und nicht auf den Fehlerkanal, im Terminal steht es also bei dem, was dein Programm ausgegeben hat. Es hängt den Zeilenumbruch selbst an, ein \n ist überflüssig. Und es nimmt mehrere Werte auf einmal, durch Kommas getrennt.

Und jetzt die Auflösung

Damit lässt sich die offene Frage aus der letzten Lektion endlich beantworten.

Der Wert, den echo verschwiegen hat
<?php

$summe = 0.1 + 0.2;

echo "echo sagt: $summe\n";
echo "var_dump sagt:\n";

var_dump($summe);
var_dump(4 / 2);
var_dump(5 / 2);

echo sagt 0.3. var_dump sagt float(0.30000000000000004). Beide zeigen denselben Wert, nur rundet echo vorher und var_dump nicht. Damit ist der Widerspruch aus der letzten Lektion keiner mehr: Der Rest war die ganze Zeit da, die Anzeige hat ihn nur geschluckt.

Für so eine Frage brauchst du übrigens keine Datei. php -r 'var_dump(0.1 + 0.2);' im Terminal führt die eine Zeile direkt aus, -r steht für „run this code”. Das ist der schnellste Weg, wenn du nur wissen willst, was PHP aus einem Ausdruck macht.

Die zwei Zeilen darunter beantworten die zweite offene Frage. 4 / 2 ist ein int, 5 / 2 ist ein float. Beim echo sah man 2 und 2.5 und konnte nur raten.

Das ist der eigentliche Wert dieses Werkzeugs. Es ist nicht dazu da, dass du hübschere Ausgaben baust, sondern dass du dir Gewissheit verschaffst, wenn ein Programm etwas anderes tut als erwartet. In neun von zehn Fällen liegt das daran, dass in einer Variablen etwas anderes liegt, als du denkst.

Wie die Sorten heißen

Manchmal willst du den Namen der Sorte als Text haben, zum Beispiel für eine Fehlermeldung.

Wie der Typ heißt
<?php

$bruch = 1.5;
$ganz = 1;

$bruchAlt = gettype($bruch);
$bruchNeu = get_debug_type($bruch);
$ganzAlt = gettype($ganz);
$ganzNeu = get_debug_type($ganz);

echo "1.5 laut gettype:        $bruchAlt\n";
echo "1.5 laut get_debug_type: $bruchNeu\n";
echo "1 laut gettype:          $ganzAlt\n";
echo "1 laut get_debug_type:   $ganzNeu\n";

gettype() gibt es seit den Anfängen von PHP, und es benutzt Wörter, die sonst niemand benutzt: double für eine gebrochene Zahl, integer für eine ganze. Im Code schreibst du float und int, im Handbuch steht float und int, nur gettype sagt etwas anderes. Das ist eine Altlast, keine Feinheit.

Seit PHP 8 gibt es deshalb get_debug_type(), und das sagt genau die Wörter, die man erwartet. Nimm im Zweifel dieses.

Zum Schluss eine Regel, die man leicht vergisst: var_dump ist ein Werkzeug und kein Programmteil. Es kommt hinein, wenn du etwas wissen willst, und es geht wieder raus, sobald du es weißt. Ein var_dump, das in fertigem Code stehen bleibt, ist auf einer Website nicht nur unschön, sondern verrät unter Umständen Dinge, die niemanden etwas angehen. Abschnitt 15 kommt darauf zurück.

Zum Mitnehmen

echo macht aus allem Text und verliert dabei genau die Auskunft, die du suchst. var_dump zeigt dir den Wert ungeschönt, samt seiner Sorte.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.