while (condition) { ... } executa o bloco de novo e de novo enquanto a condição for verdadeira. A condição é verificada antes de cada volta, então se ela for falsa desde o início, o corpo nunca roda. Algo dentro do loop precisa mudar a condição, ou ele nunca termina.
Esse é o tipo de pergunta para a qual o while foi feito: você não sabe o número de voltas de antemão, só quando parar. Mude a taxa de juros e rode de novo.
do while: rodar pelo menos uma vez
do { ... } while (condition); verifica a condição depois do corpo, então o corpo sempre roda uma vez. Repare no ponto e vírgula no fim.
Um uso típico é "tentar e depois verificar": jogar um dado até sair seis, gerar um código até encontrar um não usado. A primeira tentativa precisa acontecer antes de haver algo para verificar. Este dá um resultado diferente a cada execução:
while (true) com break
Quando a condição de saída é mais fácil de verificar no meio do corpo, escreva while (true) e saia com break. continue pula para a próxima verificação, como em qualquer loop.
array_shift() retorna null quando o array fica vazio, que é a outra saída. O mesmo loop poderia ser escrito como while ($queue), porque um array vazio conta como falso.
Ler um arquivo linha por linha
fgets() retorna uma linha por vez e false no fim do arquivo, então ele conduz um loop while diretamente. O bloco escreve o arquivo primeiro e depois o lê de volta.
Os parênteses em volta de $line = fgets($handle) importam: a atribuição acontece primeiro, depois o resultado é comparado com false. Usar !== false em vez de uma verificação simples de verdadeiro evita que uma última linha contendo só 0 (sem quebra de linha depois) encerre o loop antes da hora. A página sobre fopen() explica as funções de arquivo.
while com endwhile em templates
Como if e for, o while tem uma forma com dois pontos para HTML: while (...): e endwhile;. Este imprime uma lista de contagem regressiva na aba Page.
Erro comum: o loop que nunca termina
O contador precisa andar em direção à saída. Esqueça o $i++, ou altere a variável errada, e a condição continua verdadeira para sempre. Num servidor web, o PHP interrompe o script depois do max_execution_time (30 segundos por padrão) com um erro fatal. Na linha de comando ele nunca para.
// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
echo $i;
}
Um limite de segurança é uma proteção barata para loops que dependem de dados externos, como tentar uma chamada de novo ou paginar resultados:
Rode algumas vezes: às vezes dá certo cedo, às vezes desiste, mas sempre termina. Quando você sabe o número de voltas de antemão, um laço for informa início, fim e passo numa linha e é mais difícil de errar.
Perguntas frequentes
Qual a diferença entre while e do while no PHP?
O while verifica a condição antes de cada volta, então o corpo pode nunca rodar. do { ... } while ($cond); verifica depois de cada volta, então o corpo sempre roda pelo menos uma vez. Repare no ponto e vírgula depois da condição do do while.
Como paro um loop while infinito no PHP?
Dentro do loop, encerre-o com break quando a condição de saída for atendida: while (true) { ...; if ($done) { break; } }. Se o loop não tem break e a condição nunca fica falsa, o script roda até o max_execution_time do PHP pará-lo (requisições web) ou para sempre (linha de comando).
Quando devo usar while em vez de for no PHP?
Use while quando você não sabe quantas voltas precisa: ler até o fim de um arquivo, tentar de novo até algo dar certo, processar uma fila até ela esvaziar. Use for quando você conta, e foreach para visitar cada elemento de um array.
O PHP tem um loop do until?
Não. Negue a condição de parada num do while: do { $n++; } while (!($n >= 3)); roda até $n >= 3 ser verdadeiro. until não é uma palavra-chave do PHP.