if, match & Schleifen
PHP-Kontrollstrukturen im modernen Stil: if/else, das elegante match, Schleifen und die alternative Syntax fuer Templates.
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
UnhandledMatchErrorbei 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 vonelseifswitchfunktioniert, abermatchist fast immer bessermatchist ein Ausdruck mit strikter Pruefung - kein Fall-Throughforeach ($array as $key => $wert)fuer Arraysbreak N/continue Nfuer verschachtelte Schleifen?:(Elvis) vs.??(Null Coalescing) - beide nuetzlich
Im naechsten Kapitel: Funktionen und Arrow Functions.