while (condition) { ... } exécute le bloc encore et encore tant que la condition est vraie. La condition est vérifiée avant chaque passage, donc si elle est fausse dès le départ, le corps ne s'exécute jamais. Quelque chose dans la boucle doit modifier la condition, sinon elle ne se termine jamais.
C'est le genre de question pour lequel while est fait : vous ne connaissez pas le nombre de passages à l'avance, seulement quand vous arrêter. Modifiez le taux d'intérêt et relancez.
do while : s'exécuter au moins une fois
do { ... } while (condition); vérifie la condition après le corps, donc le corps s'exécute toujours une fois. Remarquez le point-virgule à la fin.
Un usage typique est « essayer, puis vérifier » : lancer un dé jusqu'à obtenir un six, générer un code jusqu'à en trouver un inutilisé. La première tentative doit avoir lieu avant qu'il y ait quoi que ce soit à vérifier. Celui-ci donne un résultat différent à chaque exécution :
while (true) avec break
Quand la condition de sortie est plus facile à vérifier au milieu du corps, écrivez while (true) et sortez avec break. continue passe à la vérification suivante, comme dans toute boucle.
array_shift() renvoie null une fois le tableau vide, ce qui est l'autre façon de sortir. La même boucle pourrait s'écrire while ($queue), car un tableau vide compte comme faux.
Lire un fichier ligne par ligne
fgets() renvoie une ligne à la fois et false à la fin du fichier, il pilote donc directement une boucle while. Le bloc écrit d'abord le fichier, puis le relit.
Les parenthèses autour de $line = fgets($handle) comptent : l'affectation a lieu d'abord, puis le résultat est comparé à false. Utiliser !== false plutôt qu'un simple test de vérité évite qu'une dernière ligne contenant juste 0 (sans saut de ligne après) termine la boucle trop tôt. La page fopen() couvre les fonctions de fichiers.
while avec endwhile dans les templates
Comme if et for, while a une forme à deux-points pour le HTML : while (...): et endwhile;. Celui-ci affiche une liste de compte à rebours dans l'onglet Page.
Erreur fréquente : la boucle qui ne s'arrête jamais
Le compteur doit se rapprocher de la sortie. Oubliez $i++, ou modifiez la mauvaise variable, et la condition reste vraie pour toujours. Sur un serveur web, PHP arrête le script après max_execution_time (30 secondes par défaut) avec une erreur fatale. En ligne de commande, il ne s'arrête jamais.
// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
echo $i;
}
Une limite de sécurité est une protection peu coûteuse pour les boucles qui dépendent de données extérieures, comme réessayer un appel ou parcourir des pages de résultats :
Exécutez-le plusieurs fois : parfois il réussit tôt, parfois il abandonne, mais il se termine toujours. Quand vous connaissez le nombre de passages à l'avance, une boucle for indique le départ, la fin et le pas sur une seule ligne et laisse moins de place à l'erreur.
Questions fréquentes
Quelle est la différence entre while et do while en PHP ?
while vérifie la condition avant chaque passage, donc le corps peut ne jamais s'exécuter. do { ... } while ($cond); vérifie après chaque passage, donc le corps s'exécute toujours au moins une fois. Remarquez le point-virgule après la condition du do while.
Comment arrêter une boucle while infinie en PHP ?
Dans la boucle, terminez-la avec break quand votre condition de sortie est remplie : while (true) { ...; if ($done) { break; } }. Si la boucle n'a pas de break et que sa condition ne devient jamais fausse, le script tourne jusqu'à ce que le max_execution_time de PHP l'arrête (requêtes web) ou indéfiniment (ligne de commande).
Quand utiliser while plutôt que for en PHP ?
Utilisez while quand vous ne savez pas combien de passages il faut : lire jusqu'à la fin d'un fichier, réessayer jusqu'à ce que quelque chose réussisse, traiter une file jusqu'à ce qu'elle soit vide. Utilisez for quand vous comptez, et foreach pour visiter chaque élément d'un tableau.
PHP a-t-il une boucle do until ?
Non. Inversez la condition d'arrêt dans un do while : do { $n++; } while (!($n >= 3)); tourne jusqu'à ce que $n >= 3 soit vrai. until n'est pas un mot-clé PHP.