mitmario.dev

if und else

PHP Sandbox 4 Min Lesezeit 5 BeispieleLektion 1 von 7

Alle deine Skripte bis hierher hatten eine Eigenschaft gemeinsam: Sie liefen jedes Mal genau gleich ab, von oben nach unten, egal was in den Variablen stand. Ab jetzt nicht mehr.

Wenn, dann, sonst

Eine Bedingung, zwei Wege
<?php

$bestand = 3;

if ($bestand > 0) {
    echo "Auf Lager\n";
} else {
    echo "Ausverkauft\n";
}

echo "Diese Zeile laeuft immer, sie steht ausserhalb.\n";

Ein if bekommt eine Bedingung in runde Klammern und einen Block in geschweifte. Ist die Bedingung wahr, läuft der Block. Ist sie es nicht, läuft der else-Block, falls es einen gibt.

„Wahr” heißt dabei genau das, was in Lektion 2.5 in der Tabelle stand. $bestand > 0 ergibt einen Wahrheitswert, aber du darfst auch einen beliebigen anderen Wert hinschreiben, und dann gelten die Regeln von dort: 0, "", "0" und null sind falsch, fast alles andere ist wahr.

Die letzte Zeile im Beispiel steht außerhalb der geschweiften Klammern und läuft deshalb immer. Das klingt selbstverständlich, ist aber die Zeile, die man beim Suchen als Erstes falsch liest. Die geschweiften Klammern sind die Grenze, nicht die Einrückung. PHP ist der Einzug egal, dem Menschen davor nicht.

Mehr als zwei Möglichkeiten

Mehrere Fälle hintereinander
<?php

$temperatur = 8;

if ($temperatur >= 25) {
    echo "warm\n";
} elseif ($temperatur >= 15) {
    echo "angenehm\n";
} elseif ($temperatur >= 5) {
    echo "kuehl\n";
} else {
    echo "kalt\n";
}

Für den dritten, vierten und fünften Fall gibt es elseif. Geprüft wird von oben nach unten, und sobald ein Zweig zutrifft, ist die Kette zu Ende. Die restlichen Bedingungen sieht PHP sich gar nicht mehr an.

Daraus folgt eine Regel, die man einmal verpasst und danach nie wieder: Die Reihenfolge ist Teil der Bedingung. Stünde $temperatur >= 5 im Beispiel ganz oben, wären 30 Grad plötzlich kühl, denn 30 ist nun einmal auch größer als 5. Bei sich überlappenden Grenzen gehört die engste nach oben.

Für die Vergleiche selbst gilt weiter, was in Lektion 3.6 stand: === ist die Vorgabe, == nimmst du nur, wenn du in dem Moment genau weißt, warum. Dazu kommen <, >, <=, >= und !==.

Warum elseif zusammengeschrieben wird

Wo else if wirklich scheitert
<?php

// Diese Schreibweise mit Doppelpunkt und endif begegnet dir ab
// Abschnitt 10 in Vorlagen. Hier ist sie mit Absicht kaputt:
// "else if" mit Leerzeichen ist an dieser Stelle ein Parse-Fehler.

$temperatur = 8;

if ($temperatur >= 15):
    echo "angenehm\n";
else if ($temperatur >= 5):
    echo "kuehl\n";
endif;

Mit geschweiften Klammern funktionieren beide Schreibweisen. else if ist dort schlicht ein neues if im else-Block, verschachtelt statt aneinandergereiht, und das Ergebnis ist dasselbe.

Es gibt aber eine zweite Schreibweise für Bedingungen, mit Doppelpunkt statt öffnender Klammer und endif am Schluss. Die wirst du ab Abschnitt 10 ständig sehen, weil sie sich gut zwischen HTML lesen lässt. Und dort ist else if mit Leerzeichen ein Parse-Fehler: Das Beispiel läuft nicht an, im Terminal steht syntax error, unexpected token "if", expecting ":". Tipp dort php index.php; echo $?, dann steht unter der Meldung die 255 aus Lektion 1.4.

Deshalb die einfache Verabredung: In diesem Kurs heißt es immer elseif, zusammengeschrieben. Dann funktioniert es in beiden Schreibweisen, und du musst dir den Unterschied nie merken.

Bedingungen verknüpfen

Und, oder, nicht
<?php

$alter = 17;
$begleitung = true;

if ($alter >= 18 || ($alter >= 16 && $begleitung)) {
    echo "darf rein\n";
} else {
    echo "bleibt draussen\n";
}

if (!$begleitung) {
    echo "kommt allein\n";
} else {
    echo "kommt in Begleitung\n";
}

Drei Zeichen reichen für fast alles. && heißt „und, beide müssen zutreffen”, || heißt „oder, eines reicht”, und ! dreht eine Bedingung um.

Bei gemischten Ausdrücken bindet && stärker als ||, ganz ähnlich wie Punkt vor Strich aus Lektion 3.1. Und genau wie dort lautet der Rat: Setz Klammern, auch wo sie überflüssig sind. Die Klammern im Beispiel sind rechnerisch nicht nötig, aber sie sagen dem nächsten Leser in einem Blick, welche der beiden Regeln gemeint ist.

Ein Detail, das später wichtig wird: PHP hört auf zu prüfen, sobald das Ergebnis feststeht. Bei $a && $b wird $b gar nicht mehr angesehen, wenn $a schon falsch ist. Das ist keine Sparsamkeit, sondern eine Technik: So schreibt man die Prüfung, ob etwas existiert, vor die Prüfung, was darin steht.

Zwei Kurzformen für eine Zeile

Zwei Kurzformen für eine Zeile
<?php

$eingabe = "";

$anrede = $eingabe ? $eingabe : "Gast";
echo "Lang geschrieben: $anrede\n";

$kurz = $eingabe ?: "Gast";
echo "Kurz geschrieben: $kurz\n";

$fehlt = null;
echo "Mit zwei Fragezeichen: ", $fehlt ?? "nichts da", "\n";
echo "Und bei leerem Text:   ", $eingabe ?? "nichts da", "|\n";

Wenn ein if nichts weiter tut, als einen von zwei Werten zu wählen, ist die volle Schreibweise mit fünf Zeilen zu viel. Dafür gibt es den Ternary: Bedingung, Fragezeichen, Wert für wahr, Doppelpunkt, Wert für falsch. Lässt du den mittleren Teil weg, nimmt PHP den geprüften Wert selbst, und aus $eingabe ? $eingabe : "Gast" wird $eingabe ?: "Gast".

Daneben steht ??, und der Unterschied zwischen beiden ist die Falle. ?: fragt „ist der Wert wahr?” und schluckt deshalb auch einen leeren Text. ?? fragt nur „ist der Wert null?” und lässt einen leeren Text stehen. Im Beispiel siehst du beides untereinander: einmal steht Gast da, einmal gar nichts vor dem Strich.

Verschachtele Ternarys nicht. Seit PHP 8 ist eine Kette ohne Klammern nicht nur unleserlich, sondern ein Fatal error, und die Meldung sagt sogar, wie man klammern müsste. Du kannst sie dir im Terminal ansehen, ohne eine Datei anzufassen: php -r 'echo 1 ? 2 : 3 ? 4 : 5;' bricht ab und nennt beide Klammerungen, die gemeint sein könnten. Nimm in dem Fall ein if oder das match aus der nächsten Lektion.

Zum Mitnehmen

Bis hierher lief jedes deiner Skripte immer gleich ab. Mit if bekommt es zum ersten Mal eine Gabelung: derselbe Code, andere Werte, anderes Ergebnis. Das ist der Punkt, ab dem ein Programm etwas entscheidet.

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 5 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.