mitmario.dev

Wahrheitswerte und null

PHP Sandbox 4 Min Lesezeit 4 BeispieleLektion 5 von 7

Manche Werte sind keine Zahl und kein Text, sondern eine Antwort auf eine Ja-oder-Nein-Frage. Ist der Besucher angemeldet? Ist der Artikel lieferbar? Wurde das Formular abgeschickt? Dafür hat PHP eine eigene Sorte mit genau zwei Werten: true und false.

Dazu kommt ein dritter Wert, der leicht mit ihnen verwechselt wird: null.

true und false sind Werte, keine Wörter

true und false schreibst du ohne Anführungszeichen. Sie sind keine Namen und kein Text, sondern Werte wie 42, und sie passen genauso in eine Variable.

true und false, und was echo daraus macht
<?php

$angemeldet = true;
$gesperrt = false;

echo "angemeldet: $angemeldet\n";
echo "gesperrt: $gesperrt\n";

var_dump($angemeldet);
var_dump($gesperrt);

Und hier siehst du sofort, warum diese Lektion hinter der letzten steht. echo macht aus true eine 1, und aus false macht es gar nichts. Die zweite Zeile der Ausgabe endet also hinter dem Doppelpunkt, und was dort steht, könnte auch ein leerer Text sein, eine Null oder eine Variable, die es nie gab.

var_dump sagt dagegen klar bool(true) und bool(false). Für alles, was in dieser Lektion kommt, ist es deshalb das einzig brauchbare Werkzeug.

null heißt: hier ist nichts

null ist nicht null im Sinne der Zahl. Es ist die Antwort auf eine Frage, die nie beantwortet wurde.

Der Unterschied klingt spitzfindig und ist im Alltag sehr konkret. 0 heißt „hier ist eine Zahl, und sie ist null”. "" heißt „hier ist ein Text, und er ist leer”. null heißt „hier ist überhaupt nichts”. Ein Formularfeld, in das jemand nichts eingetippt hat, liefert einen leeren Text. Ein Feld, das gar nicht abgeschickt wurde, liefert nichts. Das eine ist eine Angabe, das andere ist keine, und in Abschnitt 11 wird dieser Unterschied für dich zur täglichen Arbeit.

Was PHP für falsch hält

Jetzt kommt der Teil, der Anfängern die meiste Zeit kostet, und deswegen steht er hier als Liste zum Nachschlagen und nicht als Rätsel zum Herleiten.

Wenn PHP an einer Stelle ein Ja oder Nein braucht, du ihm aber etwas anderes gibst, dann entscheidet es selbst. Mit (bool) in Klammern kannst du diese Entscheidung sichtbar machen: Das heißt „sag mir, was du daraus machen würdest, wenn du wahr oder falsch bräuchtest”.

Was PHP für falsch hält
<?php

echo 'false:        '; var_dump((bool) false);
echo 'die Zahl 0:   '; var_dump((bool) 0);
echo 'die Zahl 0.0: '; var_dump((bool) 0.0);
echo 'leerer Text:  '; var_dump((bool) "");
echo 'der Text "0": '; var_dump((bool) "0");
echo 'leeres Array: '; var_dump((bool) []);
echo 'null:         '; var_dump((bool) null);

Das ist die vollständige Liste. Sieben Fälle, mehr gibt es nicht: false selbst, die Zahl 0, die gebrochene 0.0, der leere Text, der Text "0", ein leeres Array und null. Ein Array ist eine Liste von Werten, die kommt erst in Abschnitt 5, für heute reicht die leere Klammer als Platzhalter.

Alles andere ist wahr. Und weil das schnell gesagt und schwer geglaubt ist, hier die Fälle, die regelmäßig für Überraschung sorgen.

Und was für wahr
<?php

echo 'der Text "0.0":    '; var_dump((bool) "0.0");
echo 'der Text "false":  '; var_dump((bool) "false");
echo 'ein Leerzeichen:   '; var_dump((bool) " ");
echo 'die Zahl -1:       '; var_dump((bool) -1);
echo 'Array mit einer 0: '; var_dump((bool) [0]);

Der Text "0.0" ist wahr, obwohl die Zahl 0.0 falsch ist. Der Text "false" ist wahr, obwohl er das Gegenteil behauptet. Ein einzelnes Leerzeichen ist wahr, denn es ist ja ein Zeichen. Eine -1 ist wahr, denn nur die Null ist falsch, nicht „kleiner als eins”. Und ein Array mit einer Null darin ist wahr, weil es eben nicht leer ist.

Der einzige Fall, den man sich wirklich merken muss, ist der Text "0". Alle anderen ergeben sich aus dem Grundgedanken „leer oder null ist falsch”. Dass ausgerechnet die Zeichenkette mit einer Null darin mitgezählt wird, ist eine Entscheidung aus der Frühzeit von PHP, und du wirst ihr in Abschnitt 11 wiederbegegnen, wenn ein Formularfeld die 0 als Text liefert.

Was ein Programm mit wahr und falsch anfängt, kommt in Abschnitt 4. Dort lernst du if, und dort wird aus dieser Liste eine Regel mit Wirkung. Heute geht es nur darum, sie einmal gesehen zu haben, damit dich dort nichts überrascht.

isset und empty stellen zwei verschiedene Fragen

Zwei Funktionen tauchen im PHP-Alltag ständig auf, und sie werden ständig verwechselt.

isset und empty stellen zwei verschiedene Fragen
<?php

$leer = "";
$nichts = null;

echo 'isset($leer):     '; var_dump(isset($leer));
echo 'empty($leer):     '; var_dump(empty($leer));
echo 'isset($nichts):   '; var_dump(isset($nichts));
echo 'isset($garnicht): '; var_dump(isset($garnicht));
echo 'empty($garnicht): '; var_dump(empty($garnicht));

echo "fertig\n";

isset() fragt: Gibt es diesen Wert überhaupt, und ist er etwas anderes als null? Ein leerer Text besteht diese Prüfung, denn er existiert ja. null besteht sie nicht.

empty() fragt etwas anderes: Ist dieser Wert einer aus der Liste von oben? Für einen leeren Text lautet die Antwort ja, deshalb sagen beide Funktionen bei $leer dasselbe, aber aus verschiedenen Gründen.

Und jetzt der Punkt, der sie so nützlich macht: Sieh dir den Fehlerkanal an. Er ist leer. $garnicht gibt es nicht, und trotzdem gibt es keine Warnung, anders als bei dem echo in Lektion 2.1. Beide Funktionen dürfen nach etwas fragen, das es nicht gibt, und genau dafür sind sie gemacht.

Als Faustregel: isset(), wenn du wissen willst, ob eine Angabe da ist. empty(), wenn dir egal ist, warum sie fehlt, und du nur wissen willst, ob etwas Brauchbares drinsteht.

Zum Mitnehmen

PHP hält den Text 0 für falsch und den Text 0.0 für wahr. Diese Liste kostet mehr Anfängerstunden als jede Regel über Klammern und Semikolons.

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.