while (condizione) { ... } esegue il blocco più e più volte finché la condizione è vera. La condizione viene verificata prima di ogni passaggio, quindi se è falsa fin dall'inizio il corpo non viene mai eseguito. Qualcosa dentro il ciclo deve cambiare la condizione, altrimenti non finisce mai.
È il tipo di domanda per cui esiste while: non conosci in anticipo il numero di passaggi, solo quando fermarti. Cambia il tasso di interesse ed eseguilo di nuovo.
do while: eseguire almeno una volta
do { ... } while (condizione); verifica la condizione dopo il corpo, quindi il corpo viene sempre eseguito una volta. Nota il punto e virgola alla fine.
Un uso tipico è "prova, poi controlla": tirare un dado finché non esce un sei, generare un codice finché non è libero. Il primo tentativo deve avvenire prima che ci sia qualcosa da controllare. Questo dà un risultato diverso a ogni esecuzione:
while (true) con break
Quando la condizione di uscita è più facile da verificare a metà del corpo, scrivi while (true) ed esci con break. continue salta al controllo successivo, come in qualsiasi ciclo.
array_shift() restituisce null quando l'array è vuoto, che è l'altra via d'uscita. Lo stesso ciclo si potrebbe scrivere come while ($queue), perché un array vuoto conta come falso.
Leggere un file riga per riga
fgets() restituisce una riga alla volta e false alla fine del file, quindi guida direttamente un ciclo while. Il blocco prima scrive il file, poi lo rilegge.
Le parentesi attorno a $line = fgets($handle) contano: prima avviene l'assegnazione, poi il risultato viene confrontato con false. Usare !== false invece di un semplice controllo truthy evita che un'ultima riga contenente solo 0 (senza a capo dopo) termini il ciclo in anticipo. La pagina su fopen() tratta le funzioni sui file.
while con endwhile nei template
Come if e for, anche while ha una forma con i due punti per l'HTML: while (...): ed endwhile;. Questo stampa un elenco con il conto alla rovescia nella scheda Page.
Errore comune: il ciclo che non finisce mai
Il contatore deve avvicinarsi all'uscita. Dimentica $i++, o modifica la variabile sbagliata, e la condizione resta vera per sempre. Su un server web PHP ferma lo script dopo max_execution_time (30 secondi di default) con un errore fatale. Dalla riga di comando non si ferma mai.
// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
echo $i;
}
Un limite di sicurezza è una protezione economica per i cicli che dipendono da dati esterni, come riprovare una chiamata o scorrere pagine di risultati:
Eseguilo qualche volta: a volte riesce presto, a volte si arrende, ma termina sempre. Quando conosci in anticipo il numero di passaggi, un ciclo for indica inizio, fine e passo in una riga ed è più difficile sbagliarlo.
Domande frequenti
Qual è la differenza tra while e do while in PHP?
while verifica la condizione prima di ogni passaggio, quindi il corpo potrebbe non essere mai eseguito. do { ... } while ($cond); la verifica dopo ogni passaggio, quindi il corpo viene sempre eseguito almeno una volta. Nota il punto e virgola dopo la condizione del do while.
Come fermo un ciclo while infinito in PHP?
Dentro il ciclo, terminalo con break quando la condizione di uscita è soddisfatta: while (true) { ...; if ($done) { break; } }. Se il ciclo non ha un break e la sua condizione non diventa mai falsa, lo script gira finché max_execution_time di PHP non lo ferma (richieste web) oppure per sempre (riga di comando).
Quando usare while invece di for in PHP?
Usa while quando non sai quanti passaggi ti servono: leggere fino alla fine di un file, riprovare finché qualcosa non riesce, elaborare una coda finché non è vuota. Usa for quando conti, e foreach per visitare ogni elemento di un array.
PHP ha un ciclo do until?
No. Nega la condizione di arresto in un do while: do { $n++; } while (!($n >= 3)); gira finché $n >= 3 non è vero. until non è una parola chiave di PHP.