Zum Inhalt springen
PHP Anfรคnger 25 min

if, match & Schleifen

PHP-Kontrollstrukturen im modernen Stil: if/else, das elegante match, Schleifen und die alternative Syntax fuer Templates.

Aktualisiert:
Inhaltsverzeichnis

Kontrollstrukturen in PHP

Die Grundlagen sind C-aehnlich vertraut, aber PHP hat ein paar Eigenheiten (und mit match ein feines modernes Feature).

if / else

$alter = 18;

if ($alter >= 18) {
    echo "Volljaehrig\n";
} elseif ($alter >= 16) {
    echo "Fast volljaehrig\n";
} else {
    echo "Zu jung\n";
}

In PHP ist elseif ein Schluesselwort - schreib es zusammen, nicht else if.

Alternative Syntax (fuer Templates)

<?php if ($alter >= 18): ?>
    <p>Volljaehrig</p>
<?php elseif ($alter >= 16): ?>
    <p>Fast volljaehrig</p>
<?php else: ?>
    <p>Zu jung</p>
<?php endif; ?>

Die :-Variante mit endif; ist in .phtml-Templates beliebt - Geschweifte Klammern im HTML sind unuebersichtlich.

Ternaerer Operator

$text = $alter >= 18 ? 'volljaehrig' : 'minderjaehrig';

Kurzform ?: (Elvis)

Wenn du den gleichen Wert zurueckgeben willst, wenn truthy:

$name = $eingabe ?: 'Anonym';   // gibt $eingabe, wenn truthy, sonst 'Anonym'

?? Null Coalescing

Nur auf null / nicht gesetzt reagieren:

$name = $_GET['name'] ?? 'Anonym';

Der Unterschied: ?: reagiert auf alle falsy-Werte, ?? nur auf null.

switch

$tag = 'Dienstag';

switch ($tag) {
    case 'Montag':
        echo "Wochenstart\n";
        break;
    case 'Dienstag':
    case 'Mittwoch':
    case 'Donnerstag':
        echo "Mitte der Woche\n";
        break;
    case 'Freitag':
        echo "Bald Wochenende\n";
        break;
    default:
        echo "Wochenende\n";
}

Wichtig: Nach jedem Case brauchst du break; - sonst faellt die Ausfuehrung durch den naechsten Case.

match - die moderne Alternative

match (seit PHP 8.0) ist wie switch, aber:

  • Vergleicht streng (=== statt ==)
  • Ist ein Ausdruck - liefert einen Wert
  • Kein implizites Fall-Through
  • Wirft UnhandledMatchError bei unbehandelten Werten
$text = match ($tag) {
    'Montag' => 'Wochenstart',
    'Dienstag', 'Mittwoch', 'Donnerstag' => 'Mitte der Woche',
    'Freitag' => 'Bald Wochenende',
    default => 'Wochenende',
};

Kurzer, sicherer, aussagekraeftiger.

match(true) fuer Bedingungen

$note = match (true) {
    $punkte >= 90 => 'A',
    $punkte >= 80 => 'B',
    $punkte >= 70 => 'C',
    default => 'F',
};

Der Trick: match(true) macht jede Bedingung zu einem Vergleich === true.

while und do-while

$n = 10;
while ($n > 0) {
    echo $n . "\n";
    $n--;
}

// Mindestens einmal ausfuehren
do {
    $eingabe = readline('> ');
} while ($eingabe !== 'exit');

for

Klassische Zaehlschleife:

for ($i = 0; $i < 5; $i++) {
    echo $i . "\n";
}

foreach - der Alltag

Ueber Arrays:

$namen = ['Max', 'Anna', 'Leo'];

foreach ($namen as $name) {
    echo "Hallo, {$name}!\n";
}

// Mit Index
foreach ($namen as $i => $name) {
    echo "{$i}: {$name}\n";
}

Ueber assoziative Arrays:

$alter = ['Anna' => 28, 'Max' => 34];

foreach ($alter as $name => $jahre) {
    echo "{$name}: {$jahre}\n";
}

Veraendern waehrend Iteration

Mit Referenz (&):

$zahlen = [1, 2, 3];

foreach ($zahlen as &$z) {
    $z *= 2;
}
unset($z);  // wichtig! Referenz aufloesen
print_r($zahlen); // [2, 4, 6]

Die unset($z) nach der Schleife ist ein PHP-Idiom - sonst kann die Referenz fuer Bugs sorgen.

break und continue

foreach ([1, 2, 3, 4, 5] as $z) {
    if ($z === 3) continue;   // 3 ueberspringen
    if ($z === 5) break;      // bei 5 abbrechen
    echo $z . "\n";            // 1, 2, 4
}

Mit Level

Um aus verschachtelten Schleifen auszubrechen:

foreach ($gruppen as $g) {
    foreach ($g as $mitglied) {
        if (suche($mitglied)) {
            break 2;   // bricht BEIDE Schleifen ab
        }
    }
}

try / catch

Fehler fangen:

try {
    $zahl = intval($eingabe);
    if ($zahl < 0) {
        throw new \InvalidArgumentException('Negativ nicht erlaubt');
    }
} catch (\InvalidArgumentException $e) {
    echo 'Fehler: ' . $e->getMessage();
} catch (\Throwable $e) {
    echo 'Unerwarteter Fehler: ' . $e->getMessage();
} finally {
    echo 'Immer ausfuehren.';
}

Praktisches Beispiel

<?php

declare(strict_types=1);

function kategorisiere(int $alter): string
{
    return match (true) {
        $alter < 0 => 'ungueltig',
        $alter < 18 => 'Kind',
        $alter < 65 => 'Erwachsen',
        default => 'Senior',
    };
}

$eingabe = $_POST['alter'] ?? null;
$alter = filter_var($eingabe, FILTER_VALIDATE_INT);

if ($alter === false || $alter === null) {
    echo 'Bitte eine gueltige Zahl eingeben.';
} else {
    echo "Mit {$alter} Jahren bist du: " . kategorisiere($alter);
}

Zusammenfassung

  • if / elseif / else - achte auf die Zusammenschreibung von elseif
  • switch funktioniert, aber match ist fast immer besser
  • match ist ein Ausdruck mit strikter Pruefung - kein Fall-Through
  • foreach ($array as $key => $wert) fuer Arrays
  • break N / continue N fuer verschachtelte Schleifen
  • ?: (Elvis) vs. ?? (Null Coalescing) - beide nuetzlich

Im naechsten Kapitel: Funktionen und Arrow Functions.

Zurรผck zum PHP Kurs