Structures de contrôle du PHP

1If
2Switch
3While
3Do ... While
3For
3Foreach
3BreakContinue

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.

if

L'instruction if est une des structures de contrôle de base que l'on retrouve dans la plupart des langages. Voici les deux syntaxes:
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.
<?
$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.

Pour tester cet exemple, voir exemples/essai-ifcascade.php

switch

L'instruction switch peut élégamment remplacer une longue série de if peu lisibles. Voici les deux syntaxes:
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";  echo "<br>le php ressemble au C";  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";  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 plusieurs valeurs possibles auxquelles on doit associer la même réaction du site. , , qu'une variable contient la valeur .

Par exemple, supposons que l'on veuille réagir lorsque l'utilisateur enfonce introduit la valeur 'oui', que ce soit en majuscules ou en minuscules, ou avec la premiè lettre en majuscule ('oui' ou 'OUI' ou encore 'Oui'). On écrira alors:
<?
// on suppose que la variable $reponse contient 
//  une valeur entrée dans un formulaire, 
//  en réponse à une question de type Oui/Non.
 
switch($reponse)
{
     case 'oui':
     case 'OUI':
     case 'Oui':  echo "La valeur est 'oui', merci !";  break;
     default:  echo "La valeur n'est pas 'oui', tant pis !";  break;
}
?>

Pour tester cet exemple, voir exemples/essai-switchOUI.php

while

L'instruction while permet de répéter le bloc d'instructions qu'il contient aussi longtemps qu'une expression est vraie. Voici les deux syntaxes:

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.
<?
$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
}
?>

Dans ce script on met une variable $i à 0, puis, dans un while, on l'incrémente après avoir affiché sa valeur.

La condition d'accomplissement de la boucle est que $i soit strictement inférieur à 10.

Les boucles while sont souvent sources d'erreurs aux conséquences assez catastrophiques. Afin de minimiser ce risque, prenez garde aux choses suivantes:

do / while

L'instruction do/while fonctionne comme l'instruction while, à une exception près: l'expression est évaluée après la première itération et non avant.

Ainsi, même si l'expression est fausse, le code contenu dans le do/while sera exécuté une fois.
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

Une boucle for, c'est un peu comme un while, mais en automatique. Voici les deux syntaxes:
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.

foreach

Lorsque des valeurs sont contenues dans un tableau associatif, on peut traiter une à une chacune de ces valeurs, sans pour autant connaître d'avance les noms des indexes de la table.

Nous reviendrons sur ce type d'exemples dans la page suivante (tableau-PHP.html).

Dans l'exemple ci-dessous, le tableau $mois contient 3 valeurs, chacune accessible respectivement par les chaînes d'index : "Janvier", "Février" et "Avril".
On ne sait pas d'avance que le mois de "Mars" n'est pas concerné.
<? // exemple de tableau associatif
$mois['Janvier'] = 1;
$mois['Février'] = 5;
$mois['Avril'] = 3;

foreach ($mois as $elt) {
echo "<p>".$elt;
}
?>

Pour chaque élément trouvé dans le tableau $mois, donc $mois['Janvier'], $mois['Février'] et $mois['Avril'], l'instruction foreach définit et instancie la variable $elt avec le contenu de l'élement du tableau.

Ainsi, l'instruction foreach permet d'instancier la variable $elt; successivement avec chacune des valeurs trouvées dans le tableau $mois.

Le défaut de cette méthode est qu'elle ne donne pas accè aux noms des cellules du tableau, c'est-à-dire que dans notre cas, on ne sait pas que ces élément sont ceux d'indice : 'Janvier' , Février' et 'Avril'

Pour tester cet exemple, voir ici.

Nous verrons dans un autre chapitre plus précisément les tableaux.

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>";
}
?>

Pour tester les exemples avec break, dont les exemples des switch (case), voir ici