while (condition) { ... } führt den Block immer wieder aus, solange die Bedingung wahr ist. Die Bedingung wird vor jedem Durchlauf geprüft, also läuft der Rumpf nie, wenn sie von Anfang an falsch ist. Etwas in der Schleife muss die Bedingung verändern, sonst endet sie nie.
Für genau diese Art von Frage ist while gemacht: Du kennst die Zahl der Durchläufe vorher nicht, nur den Zeitpunkt zum Aufhören. Ändere den Zinssatz und führe den Code erneut aus.
do while: mindestens einmal ausführen
do { ... } while (condition); prüft die Bedingung nach dem Rumpf, also läuft der Rumpf immer einmal. Beachte das Semikolon am Ende.
Ein typischer Einsatz ist „versuchen, dann prüfen“: würfeln, bis eine Sechs kommt, einen Code erzeugen, bis er noch nicht vergeben ist. Der erste Versuch muss stattfinden, bevor es etwas zu prüfen gibt. Dieser hier liefert bei jedem Durchlauf ein anderes Ergebnis:
while (true) mit break
Wenn sich die Abbruchbedingung leichter mitten im Rumpf prüfen lässt, schreibst du while (true) und gehst mit break hinaus. continue springt wie in jeder Schleife zur nächsten Prüfung.
array_shift() liefert null, sobald das Array leer ist, und das ist der andere Ausweg. Dieselbe Schleife ließe sich als while ($queue) schreiben, weil ein leeres Array als falsch zählt.
Eine Datei Zeile für Zeile lesen
fgets() liefert jeweils eine Zeile und am Dateiende false, steuert also direkt eine while-Schleife. Der Block schreibt zuerst die Datei und liest sie dann zurück.
Die Klammern um $line = fgets($handle) sind wichtig: Zuerst passiert die Zuweisung, dann wird das Ergebnis mit false verglichen. !== false statt einer einfachen Truthy-Prüfung sorgt dafür, dass eine letzte Zeile, die nur 0 enthält (ohne Zeilenumbruch danach), die Schleife nicht vorzeitig beendet. Die Seite zu fopen() behandelt die Dateifunktionen.
while mit endwhile in Templates
Wie if und for hat while eine Doppelpunkt-Form für HTML: while (...): und endwhile;. Diese hier gibt im Tab Page eine Countdown-Liste aus.
Typischer Fehler: die Schleife, die nie endet
Der Zähler muss sich Richtung Ausgang bewegen. Vergiss $i++ oder ändere die falsche Variable, und die Bedingung bleibt für immer wahr. Auf einem Webserver stoppt PHP das Skript nach max_execution_time (standardmäßig 30 Sekunden) mit einem fatalen Fehler. Auf der Kommandozeile stoppt es nie.
// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
echo $i;
}
Ein Sicherheitslimit ist ein günstiger Schutz für Schleifen, die von externen Daten abhängen, etwa beim Wiederholen eines Aufrufs oder beim Blättern durch Ergebnisse:
Führe es ein paarmal aus: Manchmal klappt es früh, manchmal gibt es auf, aber es endet immer. Wenn du die Zahl der Durchläufe vorher kennst, nennt eine for-Schleife Start, Ende und Schritt in einer Zeile und ist schwerer falsch zu machen.
Häufig gestellte Fragen
Was ist der Unterschied zwischen while und do while in PHP?
while prüft die Bedingung vor jedem Durchlauf, also läuft der Rumpf vielleicht nie. do { ... } while ($cond); prüft nach jedem Durchlauf, also läuft der Rumpf immer mindestens einmal. Beachte das Semikolon nach der Bedingung von do while.
Wie stoppe ich eine endlose while-Schleife in PHP?
Beende sie in der Schleife mit break, sobald deine Abbruchbedingung erfüllt ist: while (true) { ...; if ($done) { break; } }. Hat die Schleife kein break und wird ihre Bedingung nie falsch, läuft das Skript, bis PHPs max_execution_time es stoppt (Web-Anfragen), oder für immer (Kommandozeile).
Wann sollte ich in PHP while statt for verwenden?
Verwende while, wenn du nicht weißt, wie viele Durchläufe du brauchst: Lesen bis zum Dateiende, wiederholen, bis etwas klappt, eine Warteschlange abarbeiten, bis sie leer ist. Verwende for, wenn du zählst, und foreach, um jedes Element eines Arrays zu besuchen.
Hat PHP eine do-until-Schleife?
Nein. Negiere die Abbruchbedingung in einem do while: do { $n++; } while (!($n >= 3)); läuft, bis $n >= 3 wahr ist. until ist kein PHP-Schlüsselwort.