PHP übernimmt viel repetitive Arbeit auf der Serverseite. Ein einzelner Request muss vielleicht einen Ordner voller Bilder scannen, eine Datenbank abfragen, bis sich ein Status ändert, oder einen Benutzer so lange nach einer Eingabe fragen, bis diese Ihren Regeln entspricht. Das Kopieren und Einfügen desselben Codeblocks wäre fehleranfällig und nahezu unmöglich zu warten. Schleifen existieren genau, um dieses Problem zu lösen. Sie kapseln Logik in einen wiederverwendbaren Block, reduzieren Fehler und halten Ihre Anwendung kompakt.
Die meisten PHP-Entwickler greifen instinktiv zu einer for-Schleife, wenn sie wissen, wie viele Iterationen benötigt werden, oder zu einer while-Schleife, wenn die Anzahl von einer dynamischen Bedingung abhängt. Es gibt jedoch eine dritte Option, die sich so unterschiedlich verhält, dass die Wahl zum richtigen Zeitpunkt Ihren Code deutlich klarer machen kann. Die do-while-Schleife führt den Code innerhalb ihres Blocks zuerst aus und prüft erst danach, ob er erneut ausgeführt werden soll.
Was die do-while-Schleife unterscheidet
In einer Standard-while-Schleife wertet PHP die Bedingung aus, bevor der Block überhaupt betreten wird. Wenn die Bedingung zu Beginn falsch ist, wird der Block komplett übersprungen. Eine do-while-Schleife kehrt diese Reihenfolge um. Sie führt den Code einmal aus, erreicht das Ende und prüft erst dann die Bedingung, um zu entscheiden, ob sie zurückschleifen soll.
Die Syntax sieht so aus:
do {
// statements
} while ($condition);
Beachten Sie das Semikolon nach der while-Klausel. Dieses Semikolon ist zwingend erforderlich, und das Vergessen davon führt zu einem Syntaxfehler. Der Block zwischen do und while wird immer mindestens einmal ausgeführt, selbst wenn die Bedingung von Anfang an falsch ist. Dieses Post-Test-Verhalten ist nicht nur eine Eigenart; es ist der eigentliche Grund, warum diese Schleife existiert.
Wann man zu do-while greifen sollte
Es gibt drei gängige Szenarien, in denen diese Struktur glänzt: die Anzeige eines Menüs, die Validierung von Eingaben und das Wiederholen einer Aufgabe, die fehlschlagen könnte. In jedem Fall erfordert die Logik, dass die Aktion ausgeführt wird, bevor man beurteilen kann, ob man fortfahren soll.
Anzeige eines Menüs
Stellen Sie sich ein Kommandozeilen-Tool oder ein textbasiertes Admin-Panel vor. Sie müssen eine Liste von Optionen ausgeben, darauf warten, dass der Benutzer eine auswählt, und dann entscheiden, ob das Menü erneut angezeigt werden soll. Sie können nicht prüfen, ob der Benutzer „Beenden“ gewählt hat, bevor das Menü überhaupt auf dem Bildschirm erschienen ist.
$choice = 0;
do {
echo "1. View Reports\n";
echo "2. Export Data\n";
echo "3. Exit\n";
$choice = (int) readline("Select an option: ");
if ($choice === 1) {
// fetch and display reports
} elseif ($choice === 2) {
// run export logic
}
} while ($choice !== 3);
Eine reguläre while-Schleife könnte dies technisch gesehen bewältigen, aber sie würde Sie dazu zwingen, die Menüausgabe einmal vor dem Start der Schleife zu wiederholen oder $choice mit einem Dummy-Wert zu initialisieren, nur um die Anfangsbedingung zu erfüllen. Das verteilt die zusammengehörige Logik auf zwei verschiedene Stellen. Die do-while-Version hält die Anzeige, das Einlesen und die Prüfung in einem ordentlichen Block zusammen.
Validierung von Eingaben
Die Eingabevalidierung folgt oft demselben Muster. Sie möchten den Benutzer auffordern, prüfen, was er eingegeben hat, und es wiederholen, falls es Ihre Regeln nicht erfüllt. Da die Aufforderung vor der Prüfung erfolgen muss, passt eine do-while-Schleife ganz natürlich.
do {
$username = readline("Choose a username (min 3 chars): ");
$isValid = strlen($username) >= 3;
if (!$isValid) {
echo "That username is too short.\n";
}
} while (!$isValid);
Mit einer Standard-while-Schleife müssten Sie $username mit einem leeren String initialisieren und die Zeile für die Aufforderung oberhalb der Schleife duplizieren, damit die Bedingung etwas zum Auswerten hat. Diese Wiederholung lädt zu Fehlern ein. Wenn Sie später die Nachricht der Aufforderung ändern, erinnern Sie sich vielleicht daran, sie innerhalb der Schleife zu bearbeiten, vergessen aber die Kopie darüber. Die do-while-Struktur eliminiert dieses Risiko, indem sie garantiert, dass die Aufforderung innerhalb des Blocks ausgeführt wird, bevor eine Bedingung geprüft wird.
Wiederholen einer fehlgeschlagenen Aufgabe
Netzwerkanfragen, Dateisperren und Datenbank-Schreibvorgänge schlagen manchmal beim ersten Versuch fehl, gelingen aber kurz darauf. Normalerweise möchte man es mindestens einmal versuchen und dann nur so lange weiter versuchen, wie der Fehler bestehen bleibt und man noch Geduld hat.
$attempts = 0;
$maxRetries = 3;
$success = false;
do {
$attempts++;
$response = @file_get_contents('https://api.example.com/status');
if ($response !== false) {
$success = true;
} elseif ($attempts < $maxRetries) {
sleep(1);
}
} while (!$success && $attempts < $maxRetries);
if (!$success) {
// log the permanent failure
}
Das entscheidende Detail hierbei ist, dass die Anfrage gesendet wird, bevor PHP überhaupt fragt: „Hat es funktioniert?“. Eine while-Schleife müsste eine Dummy-Anfrage durchführen oder ein falsches Erfolgsflag setzen, bevor sie die Schleife betritt, was den eigentlichen Vorgang verschleiern würde. Die do-while-Version macht die Abfolge ehrlich: versuchen, prüfen und entscheiden.
Vergleich von do-while und while
Der Unterschied zwischen diesen beiden Schleifen ist eine Frage des Timings. Betrachten wir eine Variable, die sich in einem Zustand befindet, der jeden Test fehlschlagen lassen würde:
$x = 10;
while ($x < 5) {
echo $x; // Never runs
}
Gegen denselben Startwert verhält sich eine do-while-Schleife so:
$x = 10;
do {
echo $x; // Runs once, outputs 10
} while ($x < 5);
Diese eine garantierte Ausführung ist der entscheidende Faktor. Wenn Ihre Logik null oder mehr Iterationen erfordert, ist while das sicherere Werkzeug. Wenn Ihre Logik eine oder mehr Iterationen erfordert, ist do-while in der Regel das sauberere Werkzeug.
Fallstricke und Best Practices
Da die do-while-Schleife mindestens eine Ausführung garantiert, kann sie auch eine Endlosschleife verursachen, wenn man nicht vorsichtig ist. Wenn sich die in der Bedingung geprüften Variablen innerhalb des Blocks nie ändern, wird PHP ewig weiterlaufen oder bis zum Erreichen der maximalen Ausführungszeit.
Ein weiterer häufiger Fehler ist das Weglassen des abschließenden Semikolons. Das Folgende wird fehlschlagen:
do {
// code
} while ($x < 5) // syntax error
Man sollte auch vermeiden, aus Gewohnheit auf do-while zurückzugreifen, wenn eine andere Schleife aussagekräftiger ist. Wenn Sie über ein Array iterieren, ist foreach fast immer überlegen. Wenn Sie einen einfachen numerischen Zähler verwalten, hält eine for-Schleife die Initialisierung, die Bedingung und die Inkrementierung in einer einzigen Zeile, was das Überfliegen des Codes erleichtert.
In Bezug auf die Performance verursacht do-while in PHP keinen nennenswerten Overhead im Vergleich zu while. Der Vorteil ist rein struktureller Natur. Wenn ein anderer Entwickler eine do-while-Schleife sieht, versteht er sofort, dass der Block ausgeführt werden muss, bevor eine Bedingung ausgewertet wird. Diese eine Information erspart ihm das Nachverfolgen von Dummy-Variablen oder dupliziertem Setup-Code oberhalb einer Standard-while-Schleife.
Sonderfälle und alternative Muster
Manchmal ist eine do-while-Schleife auch dann nützlich, wenn keine Benutzerinteraktion im Spiel ist. Wenn Sie beispielsweise einen Generator oder Cursor verwenden, der mindestens ein Element liefert, können Sie das erste Element verarbeiten und anschließend prüfen, ob der Cursor zu einer gültigen nächsten Position vorgerückt ist. In Legacy-Codebasen, die rohe Datenbankressourcen anstelle moderner Result-Sets verwenden, sieht man möglicherweise ein Muster wie dieses:
$row = $result->fetch();
do {
// process $row
} while ($row = $result->fetch());
Während modernes PHP foreach mit PDO bevorzugt, veranschaulicht dieses Muster, wie do-while die erste Iteration als Sonderfall ohne zusätzliche Verzweigungen behandelt.
Das wichtigste Fazit
Die do-while-Schleife ist ein spezialisiertes Werkzeug, aber am richtigen Ort ist sie das einzige Werkzeug, das Sinn ergibt. Sie hält Ihre Setup- und Validierungslogik an einem Ort, garantiert, dass eine Aktion versucht wird, bevor sie bewertet wird, und kommuniziert Ihre Absicht direkt an die nächste Person, die den Code liest. Wenn die Bedingung erst nach der Arbeit geprüft werden muss, verwenden Sie do-while. In jedem anderen Fall sollten Sie die einfacheren while, for oder foreach verwenden.
