W3docs

Entendendo os Laços PHP com a Instrução do-while

Aprenda como o laço do-while em PHP funciona, sua sintaxe, diferenças em relação ao while e casos de uso práticos como validação de entrada.

Os laços permitem executar o mesmo bloco de código várias vezes sem precisar escrevê-lo manualmente. PHP possui quatro construções de laço — for, while, do-while e foreach — e o laço do-while é o que você usa quando o corpo deve ser executado pelo menos uma vez, independentemente do que a condição diga.

É isso que diferencia o do-while de um laço while comum: um laço while verifica sua condição antes da primeira iteração, portanto o corpo pode nunca ser executado. Um laço do-while verifica a condição após cada iteração, portanto o corpo sempre executa uma vez e então se repete enquanto a condição permanecer verdadeira.

Este capítulo abrange a sintaxe, como o do-while difere do while, um caso de uso clássico do mundo real (validação de entrada), como break e continue se comportam dentro dele, e o erro comum de deslocamento por um.

Sintaxe

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

O corpo fica dentro do bloco do { ... }, e a condition é testada após a execução do corpo. Observe o ponto e vírgula após while (condition) — ele é obrigatório aqui (ao contrário de um laço while comum) e esquecê-lo é um erro de sintaxe frequente.

O fluxo é: executar o corpo uma vez → avaliar a condição → se for verdadeira, executar o corpo novamente → repetir → parar na primeira vez que a condição for falsa.

Um primeiro exemplo

Isso imprime os números de 1 a 10:

php— editable, runs on the server

O corpo é executado, imprime $i, incrementa-o, e então a condição $i <= 10 é verificada. Quando $i chega a 11, a condição é falsa e o laço termina, assim os dígitos de 1 a 10 são impressos.

do-while vs. while: a diferença principal

O corpo de um laço do-while sempre é executado pelo menos uma vez, mesmo quando a condição é falsa desde o início. Um laço while, em contraste, pode executar zero vezes. Compare:

<?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

Mesmo que 100 < 10 seja falso nos dois casos, o corpo do do-while ainda foi impresso uma vez. Use do-while sempre que "execute isso, depois decida se repete" corresponder à sua lógica.

Uso no mundo real: validando entrada

O comportamento de "executar pelo menos uma vez" é perfeito para solicitar algo a um usuário (ou repetir uma operação) até que o resultado seja aceitável — você sempre precisa de pelo menos uma tentativa antes de ter algo a validar:

<?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

O laço continua até que o PIN correto seja inserido ou o limite de tentativas seja atingido — e nunca precisa de uma "primeira tentativa" separada antes do laço.

break e continue

break sai do laço imediatamente, e continue pula para a verificação da condição (a próxima iteração):

<?php

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

// Output: 1245

O 3 é ignorado pelo continue, e o break para o laço após o 5, portanto 1, 2, 4, 5 são impressos.

Erro comum: a armadilha do deslocamento por um

Como o do-while executa antes de verificar, uma condição "vazia" ainda produz uma iteração. Se você processar uma coleção que pode estar vazia, prefira foreach ou while — um do-while processaria um elemento inexistente primeiro:

<?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

Use do-while apenas quando "pelo menos uma vez" for genuinamente o que você deseja.

Fluxograma

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

Capítulos relacionados

Prática

Prática
Qual é o comportamento e a funcionalidade do laço 'do-while' em PHP?
Qual é o comportamento e a funcionalidade do laço 'do-while' em PHP?
Was this page helpful?