PHP.de Wissenssammlung

if

Mythos if-Schleife
if ist eine Kontrollstruktur
Notierung
Korrekte Notierung gem. PEAR-Standard
Syntaktische Fallstricke
Diese Fallen lauern
Unnötige Konstrukte
So geht es besser

Mythos if-Schleife

Zuerst sei ein oft vorkommender Mythos aufgeklärt:

  • Es gibt keine if-Schleifen.
  • Es gibt keine if-Schlaufen.

Das Wesen einer Schleife ist die Wiederholung. if bildet einen Block aus Anweisungen und Ausdrücken.

if ist eine Kontrollstruktur aber deshalb noch lange keine Schleife.

Notierung

Die korrekte Notierung gemäß PEAR Standard beschreibt die Angabe immer mit geschweiften/geschwungenen Klammern { }.

Beispiel

if (Bedingung1) {
    Aktion1;
} elseif (Bedingung2) {
    Aktion2;
} else {
    Standardaktion;
}

Übliche Darstellung if / else

Nachfolgend eine übliche Darstellung, diese entspricht einem entweder / oder.

if (!empty($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'standard';
}

Etwas verkürzte Notierung mit default-Vorbelegung

Eine alternative, etwas kürzere Variante, mit Wert-Vorbelegung und Übersteuerung, wenn die Bedingung zutrifft.

$action = 'standard'; // Initiale Vorbelegung
if (!empty($_POST['action'])) {
    $action = $_POST['action'];
}

Bedingungsoperator (?:)

Der Bedingungsoperator ?: (auch Konditionaloperator) gehört zur Gruppe der ternären Operatoren (Operatoren mit drei Operanden). Da diese Gruppe in vielen Programmiersprachen lediglich diesen einen Operator umfasst, wird ?: oftmals einfach nach dem Namen der Gruppe als „ternärer Operator“ bezeichnet.

Im Unterschied zur if-Anweisung, die anhand von Bedingungen den Kontrollfluss zu weiteren Anweisungsgruppen steuert, handelt es sich beim Bedingungsoperator lediglich um einen Ausdruck, der (wie jeder Ausdruck) zu einem Wert evaluiert wird. Dieser Wert kann wiederum Operand in einem übergeordneten Ausdruck sein (etwa in einer Zuweisung oder einer Addition). Daraus folgt die weitere Bezeichnung inline if (iif). Der Bedingungsoperator kann nicht dazu genutzt werden, Anweisungen zu gruppieren.

Die grundsätzliche Notation lautet wie folgt:

Ausdruck1 ? Ausdruck2 : Ausdruck3

Trifft die Bedingung in Ausdruck1 zu (evaluiert der Ausdruck als == true), wird Ausdruck2 evaluiert und als Wert des Gesamtausdrucks gesetzt, ansonsten Ausdruck3 („entweder/oder“).

Durch Schachtelung von Bedingungsoperatoren können auch Konzepte wie elseif in Ausdrücke integriert werden. Hier empfiehlt es sich aber gemeinhin, die herkömmliche Variante (die if-Anweisung) zu nutzen, um die Übersicht zu behalten.

Nachfolgendes Beispiel entspricht den beiden Beispielen aus den vorherigen Abschnitten:

$action = (!empty($_POST['action'])) ? $_POST['action'] : 'standard';

Anmerkung: Die Klammerung der Bedingung ist syntaktisch nicht erforderlich, wird jedoch zur besseren Lesbarkeit empfohlen.

Bedingungsoperatoren finden häufig bei derartigen Zuweisungen Verwendung, weil auf diese Weise die Notwendigkeit wegfällt, die Variable vor einer if-Anweisung mit einem Standardwert belegen zu müssen, und weil gleichzeitig klar zu erkennen ist, dass die Variable unter allen Umständen mit einem Wert belegt wird.

Syntaktische Fallstricke

Nur ein Gleichheitszeichen =

if ($ampel = "gruen") {
    echo "Go!";
}

Nur ein = Zeichen ist eine Zuweisung und würde immer als true gewertet. Zum direkten Vergleich sind zwei == oder drei === Zeichen nötig. Details dazu zum Thema typschwacher und typsicherer Vergleich gibt es ebenfalls hier.

Schreibweise ohne geschweifte Klammern

Ohne den geschweiften Klammern wird jeweils nur die erste Anweisung nach dem if ausgeführt. Nachfolgende Anweisungen werden, unabhängig davon, immer ausgeführt. Zur besseren Lesbarkeit wird grundsätzich von dieser Notaiton abgeraten, diese findet auch im PEAR-Standard keine Anwendung.

Negativbeispiel

if ($ampel == "gruen")
    echo "Na endlich!"; // nur diese Anweisung wird gemäß der if-Bedingung ausgeführt
    echo "Go!";         // diese Anweisung wird unabhängig von if immer ausgeführt

Semikolon nach der Bedingung

Ein Semikolon nach der Bedingung beendet für PHP die Anweisung sofort. Somit werden alle nachfolgende Anweisungen ausgeführt.

if (1 == 2); {
    echo "Ja";
}
echo "Nein";

// JaNein

Unnötige Konstrukte

Unnötige Prüfungen zu bool (true oder false) hin

Das Audruck in der Klammer ( ) nach dem if wird direkt immer zu true oder false ausgewertet. Mit diesem Hintergrundwissen fällt auf, das es oft unnötige Anwendungen des if Konstruktes gibt.

Beispiel, eine Prüfung ob ein User Volljährig ist, könnte so aussehen:

if ($userAge >= 18) {
    $userIsAdult = true;
} else {
    $userIsAdult = false;
}

Da die Bedigung ($userAge >= 18) bereits true oder false zurückgibt, wäre die für diese Fall ausreichend:

$userIsAdult = ($userAge >= 18);

Anmerkung: Die Klammerung der Bedingung ist nicht nötig, wird jedoch der besseren Lesbarkeit empfohlen.

Dieser Beitrag ist fertiggestellt und wurde zuletzt von mermshaus bearbeitet.

An diesem Beitrag waren bisher beteiligt: hausl, mermshaus