PHP/Tutorials/Einstieg/Kontrollstrukturen

Aus SELFHTML-Wiki
< PHP‎ | Tutorials‎ | Einstieg
Wechseln zu: Navigation, Suche

Verzweigungen

Wie in vielen anderen Programmiersprachen auch bietet PHP Sprachelemente, sogenannte Kontrollstrukturen, um Verzweigungen zu realisieren. Dazu zählen die einfache Verzweigung mit if und die mehrfache Verzweigung mit switch.

Einfachverzweigung mit if/else

Mit der sogenannten if-Anweisung (if, engl. für „falls“) kann man eine Bedingung prüfen. Das Sprachkonstrukt (es ist keine Funktion) wird mit dem Schlüsselwort if notiert, gefolgt von einem Paar runder Klammern, in dem eine Bedingung notiert wird. Diese Bedingung wird nach dem "Falls-Dann-Prinzip" geprüft. Falls sie zutrifft, dann soll etwas bestimmtes passieren. Dies ist ein Anweisungsblock, der innerhalb von geschweiften Klammern notiert und zur besseren Lesbarkeit eingerückt wird.

Für den Fall, dass die Bedingung nicht erfüllt ist, kann man einen Alternativzweig mit dem Schlüsselwort else (else, engl. für „ansonsten“) festlegen.

einfache Verzweigung mit if
$haben = 10;
$limit = 20;

if($haben > $limit) {
  // gibt Ergebnis aus
  print "Einkaufen gehen";
}
else {
  print "Nicht einkaufen gehen";
}


In diesem Beispiel haben wir zwei Variablen, eine mit dem Wert 10 und eine mit 20. Die If-Anweisung überprüft ob $haben größer $limit ist. Ist das der Fall dann schreibt PHP »Einkaufen gehen«. Um jetzt keine zweite If-Anweisung schreiben zu müssen, die den gegenteiligen Fall abdeckt, gibt es die else-Anweisung. Wenn also $haben kleiner oder gleich $limit ist dann schreibt PHP »Nicht einkaufen gehen«.

In unserem Beispiel also: Wenn $haben größer als $limit dann schreibe »Einkaufen gehen« ansonsten schreibe »Nicht einkaufen gehen«.

Beachten Sie: Geschweifte Klammern (sie fassen einen Anweisungsblock zusammen), wie hier um den Aufruf der print-Funktion herum, sollten Sie bei Verzweigungen immer notieren, auch wenn sie bei nur einer einzelnen Anweisung prinzipiell entfallen könnten. Es hat sich in der Praxis aber als hilfreich erwiesen, wenn Sie diese grundsätzlich notieren, da in diesem Fall eine spätere Erweiterung keine unerwarteten Programmverläufe produziert.

Experiment: Passwort prüfen

Wir legen zwei neue Dateien an, eingabe.html und ausgabe.php:

eingabe.html
<form action="ausgabe.php" method="post">
 <label>Passwort: <input type="password" name="pw"></label>
 <button>Senden</button>
</form>


Wir erstellen ein neues Formular, welches eingegebene Daten an ausgabe.php versenden wird. In das Passwortfeld müssen wir später unser Passwort eintragen und mit dem Button das Formular abschicken.

ausgabe.php
if ($_POST["pw"] == "test") {
  print "Herzlich Willkommen im geschützten Bereich";
}
else {
  print "Falsches Passwort";
}


Per if-Anweisung überprüfen wir, ob das eingegebene Passwort dem Wert »test« entspricht, wenn ja, dann hat man Zutritt zum geschützten Bereich, ansonsten nicht.

Beachten Sie: Die Passwort-Prüfung ist in der vorliegenden Form noch keine sinnvolle Lösung für eine Zugangsbeschränkung (daher das "Experiment:" im Titel). Hier muss bei jedem Seitenaufruf das Passwort erneut eingegeben und das Formular abgeschickt werden um an die geschützten Inhalte zu gelangen. Weiterführende Hinweise zu dieser Problematik bietet der Artikel Sicherheit/Zugriffsschutz.

Mehrfachverzweigung mit switch

Mit der Switch-Anweisung lassen sich quasi mehrere If-Abfragen bündeln, wenn man eine Variable auf unterschiedliche Inhalte abfragen möchte.

Mehrfachverzweigung mit switch
$a = 30;
$b = 12;
$op = "-";

switch ($op){
    case "+":
        echo "$a plus $b ergibt: ", $a + $b;
        break;
    case "-":
        echo "$a minus $b ergibt: ", $a - $b;
        break;
    case "*":
    case "x":
        echo "$a mal $b ergibt: ", $a * $b;
        break;
    case "/":
    case ":":
        echo "$a durch $b ergibt: ", $a / $b;
        break;
    default:
        echo "Das Rechenzeichen '$op' ist mir unbekannt.";
}


Mit dem Schlüsselwort switch wird die Struktur eingeleitet. In runden Klammern wird ein Ausdruck notiert (hier eine Variable), der zu prüfen ist.

Die einzelnen Fallunterscheidungen werden mit der Kombination aus case und break notiert. Nach dem Schlüsselwort case steht ein Wert, gefolgt von einem Doppelpunkt. Danach folgen beliebig viele Anweisungen, die für diesen Fall gelten. Mit dem Schlüsselwort break (unbedingt mit abschließendem Semikolon!) wird der jeweilige Fall abgeschlossen.

Das Schlüsselwort default (default, engl. Vorgabe) ist für alle die Fälle gemeint, die keinem der notierten Fälle entsprechen, weshalb hier kein Wert vor dem Doppelpunkt notiert wird. In diesem Code-Beispiel steht es an letzter Stelle, weshalb auf das abschließende break verzichtet werden kann.

Folgt einem case kein break, so werden alle nachfolgenden Anweisungen der folgend notierten Fälle abgearbeitet, bis wieder ein break steht. Damit kann man Anweisungen zusammenfassen:


Mehrfachverzweigung mit "Durchrutschen"
$note = 1;

echo "Sie haben eine ";

switch ($note){
    case 1:
        echo "sehr ";
    case 2:
        echo "gute ";
    default:
        echo "Note ";
}

echo $note," bekommen.";
// Ergebnisse
// $note = 1: "Sie haben eine sehr gute Note 1 bekommen."
// $note = 2: "Sie haben eine gute Note 2 bekommen."
// $note = 3: "Sie haben eine Note 3 bekommen."

Das Fehlen von break nach jedem case führt dazu, dass alle folgenden echo-Anweisungen ausgeführt werden.

Schleifen

Mit Schleifen lassen sich Programmblöcke beliebig oft wiederholen.

For-Schleife

Die For-Schleife wird verwendet, wenn eine bestimmte Anzahl an Durchläufen benötigt wird.

Beispiel


for($a = 10; $a < 20; $a++) {
  echo $a;
}


Als erstes wird mit $a = 10 der Schleifenvariable a ein Startwert, zehn, gegeben. Als zweites wird mit $a < 20 festgelegt, unter welcher Bedingung die Schleife fortgeführt werden soll. In unserem Fall solange, bis die Schleifenvariable den Wert 20 erreicht. Als drittes wird mit $a++, angegeben, was bei jedem Durchlauf der Schleife verändert wird, hier wird bei jedem Durchlauf der Wert der Schleifenvariable um eins erhöht.

Häufig werden für solche Schleifenvariablen (Zähler) die Variablen i (wie index) oder k verwendet.

For-Each-Schleife

Sie wird verwendet, wenn alle Elemente eines Arrays behandelt werden sollen.

Beispiel
$einArray = array(1, 2, 3, 4);

foreach ($einArray as $Wert) {
    echo $Wert;
}


In PHP gibt es sogenannte "assoziative Arrays", also Arrays, deren Elemente nicht schlicht nummeriert sind, sondern anstelle der Nummer einen Namen tragen. Egal ob Name oder Nummer, man spricht von Schlüsseln:

Beispiel
$einArray = array(
  'eins' => 1,
  'zwei' => 'Hallo Welt!',
  3 => 'drei',
  'fier' => 'vier'
);

foreach ($einArray as $key => $value) {
  printf(
    'Schlüssel: "%s" - Wert: "%s"'.PHP_EOL,
    $key,
    $value
  );
}

Die Ausgabe sollte so aussehen:

Schlüssel: "eins" - Wert: "1"
Schlüssel: "zwei" - Wert: "Hallo Welt!"
Schlüssel: "3" - Wert: "drei"
Schlüssel: "fier" - Wert: "vier"


While-Schleife

Schleifen, die eine Abbruchbedingung prüfen, nennt man While-Schleifen. While heißt "Solange", d. h. die Schleife wird solange wiederholt, wie die Bedingung "wahr" ist.

Beispiel
while (true) {
    echo "1";
}

Hier haben wir eine Endlosschleife, die solange eine Eins ausgibt, wie das Universum existiert.


Diese normale While-Schleife ist eine sogenannte kopfgesteuerte Schleife, sie prüft die Bedingung, bevor sie überhaupt in den Schleifenkörper hineingeht. Dagegen führt die Do-While-Schleife den Schleifenkörper mindestens einmal aus, bevor die Bedingung geprüft wird.


Beispiel
do {
    echo "1";
}
while (false);

Hier wird nur einmal eine Eins ausgegeben.


Fehlerquelle: Endlosschleife

Beachten Sie, dass Sie bei Schleifen immer auch eine Abbruchbedingung formulieren. Ansonsten erzeugen Sie eine Endlosschleife, die nur durch das Abschalten des Computers beendet werden kann.
Beispiel
$count = 1;
while($count < 4)
{
  echo 'Blabla';
}

Die Abbruchbedingung (Variable count >= 4) kann niemals erreicht werden, deshalb läuft die Schleife also endlos, bis irgendein Timeout greift.

Weblinks

PHP-Handbuch