Structures de contrôle
Un article de Mangue.org, l'encyclopéde libre.
Les structures de contrôle du PHP sont très similaires à celles du langage C. Cependant, PHP dispose de deux syntaxes équivalentes. L'une est dans un pur style C, avec des accolades pour englober les instructions, tandis que l'autre est un peu plus explicite, à la manière du pseudo-code. L'utilisation de l'une ou de l'autre est une simple affaire de goût, sachant qu'il n'est jamais obligatoire d'en utiliser une en particulier.
| Sommaire |
if
| if(expression) { instructions } elseif(expression) { instructions } else { instructions } | if(expression): instructions elseif(expression): instructions else: instructions endif; |
Si expression est évaluée à vrai, la portion de code suivant le if sera exécutée. Sinon, l'expression suivant le elseif sera évaluée, et le code suivant cette instruction exécuté si l'expression est évaluée à vrai. Dans le cas contraire, les instructions suivant les else seront exécutées. Le else et le elseif sont bien sûr optionnels.
Notez que dans la première syntaxe, on peut se passer des accolades s'il n'y a qu'une seule instruction à exécuter.
Exemple:
<? $i = 3; if( $i == 2 ) { echo "La variable i est égale à 2"; } elseif( $i == 3 ) { echo "La variable i est égale à 3"; } else { echo "La variable i n'est égale ni à 2, ni à 3"; } ?>
Ce code affichera donc "La variable i est égale à 3"... A vous de changer la valeur de $i au début du script pour bien comprendre le fonctionnement du if.
switch
| switch(expression) { case expression: instructions break; default: instructions break; } | switch(expression): case expression: instructions break; default: instructions break; endswitch; |
L'expression de chaque instruction case est comparée à l'expression du switch. Si elles sont égales, le bloc d'instructions suivant le case est exécuté. Le mot-clef break permet de sortir du switch. Sans lui, toutes les exécutions suivant le case concerné (y compris celles des case suivants) s'exécuteraient. Si aucun des case ne correspond à l'expression switch, c'est le bloc d'instructions suivant default qui sera exécuté.
Si on reprend l'exemple précédent, le script devient:
<? $i = 3; switch($i) { case 2: echo "La variable i est égale à 2"; break; case 3: echo "La variable i est égale à 3"; break; default: echo "La variable i n'est égale ni à 2, ni à 3"; break; } ?>
Remarquez que, malgré son omniprésence, break n'est pas requis par l'instruction switch. En effet, on peut très sciemment s'en passer: imaginons le cas suivant:
<? $i = 3; switch($i) { case 2: echo "La variable i est égale à 2"; echo "<br>le php ressemble au C"; break; case 3: echo "La variable i est égale à 3"; break; default: echo "<br>le php ressemble au C"; break; } ?>
On pourrait très bien contracter ce code en:
<? $i = 3; switch($i) { case 3: echo "La variable i est égale à 3"; break; case 2: echo "La variable i est égale à 2"; default: echo "<br>le php ressemble au C"; break; } ?>
Ce code donnera exactement le même résultat que le précédent.
On notera aussi que l'on peut grouper les case, lorsqu'on teste, par exemple, l'appui sur les touches d'un clavier. Supposons que l'on veuille réagir lorsque l'utilisateur enfonce la touche 'r', que ce soit en majuscules ou en minuscules. On écrira alors:
<? // on suppose que la variable $touche // contient la touche enfoncée switch($touche) { case 'r': case 'R': echo "Vous avez enfoncé R ou r."; break; default: echo "Vous n'avez pas enfoncé R ou r."; break; } ?>
while
| while(expression) { instructions } | while(expression): instructions endwhile; |
De la même façon que pour le if, la première syntaxe peut se passer des accolades s'il n'y a qu'une instruction à exécuter.
L'expression while est évaluée avant chaque itération. (une itération = un tour de boucle) Ce qui veut dire que si votre expression est fausse, le programme ne passera même pas une fois dans votre boucle. Si l'expression est vraie, le code sera exécuté, puis l'expression réévaluée. Si elle se révèle vraie une fois de plus, le code sera exécuté une seconde fois, etc, jusqu'à ce que l'expression soit fausse. Si l'expression est fausse, l'exécution du programme reprend immédiatement après la fermeture de la boucle.
Exemple:
<? $i = 0; while( $i < 10 ) // tant que $i est plus petit que 10 { echo "La variable i est égale à $i<br>"; $i++; // on incrémente $i } ?>
- N'oubliez pas d'initialiser toute variable faisant partie de l'expression while, sous peine de résultats aléatoires...
- De même, si vous faîtes une boucle telle que celle ci-dessus, n'oubliez pas de faire varier la variable qui fait partie de l'expression. Vous risquez sinon de créer une boucle infinie.
do / while
| do { instructions } while(expression); |
(nb: il n'existe qu'un seule syntaxe pour cette structure de contrôle.)
Les accolades peuvent être omises s'il n'y a qu'une seule instruction.
Le script précédent, avec un do/while:
<? $i = 0; do { echo "La variable i est égale à $i<br>"; $i++; } while( $i < 10 ); ?>
for
| for(expr_de_départ; expr_conditionnelle; expr_itérative) { instructions } | for(expr_de_départ; expr_conditionnelle; expr_itérative): instructions endfor; |
Une boucle for contient trois expressions. La première est l'expression de démarrage: elle sera évaluée une et une seule fois au début de la boucle. On l'utilise en général pour initialiser un compteur.
La seconde expression est l'expression conditionnelle. L'expression est évaluée avant chaque itération, et, si elle est vraie, le code contenu dans la boucle est exécuté. Sinon l'exécution du programme se poursuit à partir de l'instruction suivant la fermeture de la boucle.
La troisième et dernière expression est l'expression itérative. Elle est évaluée à la fin de chaque itération. On l'utilise en général pour incrémenter le compteur qu'on a initialisé dans l'expression de démarrage.
Dans la première syntaxe, on peut se passer des accolades si la boucle for ne contient qu'une instruction.
Voici le même script que précédemment, cette fois avec un boucle for:
<? for($i = 0; $i < 10; $i++) { echo "La variable i est égale à $i<br>"; } ?>
Même si ça parait moins clair de prime abord, on s'aperçoit vite que c'est bien plus pratique et lisible qu'un while.
break et continue
Break et continue sont deux mots-clefs bien utiles avec les boucles while, do/while et for. Ils permettent respectivement de sortir de la boucle en cours et de passer à l'itération suivante. Si on utilise break dans des boucles imbriquées, on sortira de la boucle courante pour atterrir dans la boucle de niveau supérieur. Cependant, on peut sortir de plusieurs niveaux de boucles en une seuls instruction en utilisant break n, où n est le nombre de boucles imbriquées à interrompre. De même, en utilisant continue n, on peut sauter les itérations courantes de n boucles imbriquées.
Ces deux mot-clefs fonctionnent de la même façon avec while, do/while et for, sauf pour continue dans le cas d'une boucle for. En effet, dans ce cas, on notera que l'utilisation de ce mot-clef force l'évaluation de l'expression itérative avant la vérification de l'expression conditionnelle de la boucle. Plus simplement, on pourrait dire que le programme "n'oublie pas" de traiter votre compteur de boucle comme vous lui avez dit de le faire, même si vous utilisez un continue.
Supposons que l'on veuille reprendre l'exemple précédent, mais cette fois sans faire d'affichage lorsque $i vaut 5:
<? for($i = 0; $i < 10; $i++) { if( $i == 5 ) continue; echo "La variable i est égale à $i<br>"; } ?>
Avec break, nous pouvons arrêter l'affichage lorsqu'on atteint le nombre 5 en sortant de la boucle:
<? for($i = 0; $i < 10; $i++) { if( $i == 5 ) break; echo "La variable i est égale à $i<br>"; } ?>

