W3docs

Comprendere i cicli PHP con l'istruzione do-while

Il ciclo do-while in PHP esegue il corpo almeno una volta, poi verifica la condizione. Scopri sintassi, esempi e differenze con while.

I cicli ti permettono di eseguire lo stesso blocco di codice molte volte senza doverlo scrivere a mano. PHP dispone di quattro costrutti di ciclo — for, while, do-while e foreach — e il ciclo do-while è quello da usare quando il corpo deve essere eseguito almeno una volta, indipendentemente dalla condizione.

Questo è ciò che distingue do-while da un normale ciclo while: un ciclo while verifica la condizione prima della prima iterazione, quindi il corpo potrebbe non essere mai eseguito. Un ciclo do-while verifica la condizione dopo ogni iterazione, quindi il corpo viene sempre eseguito almeno una volta e poi si ripete finché la condizione rimane vera.

Questo capitolo tratta la sintassi, le differenze tra do-while e while, un classico caso d'uso reale (validazione dell'input), il comportamento di break e continue al suo interno e la comune trappola dell'errore di uno.

Sintassi

do {
    // code to be executed each iteration
} while (condition);

Il corpo si trova all'interno del blocco do { ... }, e la condition viene valutata dopo l'esecuzione del corpo. Nota il punto e virgola dopo while (condition) — è obbligatorio qui (a differenza di un normale ciclo while) e dimenticarlo è un errore di sintassi frequente.

Il flusso è: esegui il corpo una volta → valuta la condizione → se è truthy, esegui di nuovo il corpo → ripeti → fermati la prima volta che la condizione è falsy.

Un primo esempio

Questo stampa i numeri da 1 a 10:

php— editable, runs on the server

Il corpo viene eseguito, stampa $i, lo incrementa, poi viene verificata la condizione $i <= 10. Quando $i raggiunge 11 la condizione è falsa e il ciclo termina, quindi vengono stampate le cifre da 1 a 10.

do-while vs. while: la differenza principale

Il corpo di un ciclo do-while viene sempre eseguito almeno una volta, anche quando la condizione è falsa fin dall'inizio. Un ciclo while, al contrario, può essere eseguito zero volte. Confronta:

<?php

// do-while: body runs once, THEN the condition is checked
$x = 100;
do {
    echo "do-while ran\n";
} while ($x < 10);

// while: condition checked first, so the body never runs
$y = 100;
while ($y < 10) {
    echo "while ran\n";
}

// Output:
// do-while ran

Anche se 100 < 10 è falso in entrambi i casi, il corpo del do-while ha comunque stampato una volta. Usa do-while ogni volta che la logica "esegui, poi decidi se ripetere" corrisponde al tuo caso.

Caso d'uso reale: validazione dell'input

Il comportamento "esegui almeno una volta" è perfetto per richiedere input all'utente (o ripetere un'operazione) finché il risultato non è accettabile — serve sempre almeno un tentativo prima di avere qualcosa da validare:

<?php

$attempts = 0;
$pin = "";

do {
    $attempts++;
    // In real code this would read from input; we simulate the attempts:
    $pin = ["123", "0000", "4821"][$attempts - 1];
    echo "Attempt $attempts: tried '$pin'\n";
} while ($pin !== "4821" && $attempts < 3);

echo $pin === "4821" ? "Access granted\n" : "Locked out\n";

// Output:
// Attempt 1: tried '123'
// Attempt 2: tried '0000'
// Attempt 3: tried '4821'
// Access granted

Il ciclo continua finché non viene inserito il PIN corretto o viene raggiunto il limite di tentativi — e non necessita di un "primo tentativo" separato prima del ciclo.

break e continue

break esce immediatamente dal ciclo, mentre continue salta direttamente alla verifica della condizione (l'iterazione successiva):

<?php

$i = 0;
do {
    $i++;
    if ($i === 3) {
        continue; // skip printing 3
    }
    if ($i > 5) {
        break;    // stop entirely
    }
    echo $i;
} while (true);

// Output: 1245

3 viene saltato da continue, e break ferma il ciclo dopo 5, quindi vengono stampati 1, 2, 4, 5.

Trappola comune: l'errore di uno

Poiché do-while viene eseguito prima della verifica, una condizione "vuota" produce comunque una iterazione. Se elabori una collezione che potrebbe essere vuota, preferisci foreach o while — un do-while elaborerebbe prima un elemento inesistente:

<?php

$items = []; // empty!
$index = 0;
do {
    echo "Processing item $index\n"; // runs once even though there are no items
    $index++;
} while ($index < count($items));

// Output: Processing item 0

Usa do-while solo quando "almeno una volta" è genuinamente ciò che desideri.

Diagramma di flusso

graph LR
A[Start] --> B[Execute code block]
B --> C[Check condition]
C --> D{Is condition true?}
D --Yes--> B
D --No--> E[End]

Capitoli correlati

Esercitazione

Pratica
Qual è il comportamento e la funzionalità del ciclo 'do-while' in PHP?
Qual è il comportamento e la funzionalità del ciclo 'do-while' in PHP?
Was this page helpful?