Les structures de contrôle : les conditions
Ce chapitre présente 2 principes importants à assimiler : les condititions et les boucles. Ce premier concept est particulièrement important puisqu'il permet d'effectuer une série d'actions en fonction des conditions que l'on teste. Quant au second, il permet de répéter N fois une série d'actions, et ce dans des temps très courts (à l'échelle humaine). L'intérêt de l'arrivée de l'informatique est de pouvoir faciliter la vie des utilisateurs en exécutant des tâches que ces derniers ne peuvent remplir. Si l'on demande à une personne de compter de 0 jusqu'à 1 000, il lui faudra plusieurs minutes tandis qu'un ordinateur traitera cette opération en quelques millisecondes (voire quelques nanosecondes selon sa puissance de calcul). On comprend alors tout de suite les atouts de l'informatique.
Les structures conditionnelles
Une structure conditionnelle permet d'exécuter ou non une série d'instructions en fonction d'une condition d'origine (appellée aussi expression ou prédicat). Si le calcul de cette condition retourne TRUE alors le bloc d'instructions concerné est exécuté. Les expressions évaluées peuvent être plus ou moins complexes, c'est à dire qu'elles peuvent être constituées d'une combinaison d'opérateurs de comparaison, d'opérateurs logiques et même de fonctions.
Le langage PHP introduit 4 constructions conditionnelles : if, elseif, else et switch.
L'instruction conditionnelle if()
C'est la plus connue de toutes car on la retrouve dans tous les langages de programmation. Elle permet d'exécuter un bloc d'instructions uniquement si l'expression est vraie. Le mot clé if() signifie en anglais si. Sa syntaxe est la suivante :
Principe de fonctionnement de l'instruction if()if(expression){bloc d'instructions;}
Illustrons son fonctionnement avec un exemple simple.
Exemple d'utilisation de l'instruction if()<?php// Déclaration d'une variable$vitesse = 60;// On teste la valeur de la variableif($vitesse > 50){echo 'Je perds 1 point pour excès de vitesse !';echo 'Le policier me dit : "Roulez doucement maintenant !"';}?>
Le code ci-dessus modélise la vitesse d'un véhicule par une variable $vitesse. La condition quant à elle vérifie la vitesse du véhicule. Si cette valeur dépasse les 50 (Km/h), alors le conducteur est arrêté par les forces de l'ordre et perd un point sur son permis de conduire. Si sa vitesse est inférieure ou égale à 50 alors rien ne se passe car le conducteur n'est pas en infraction.
La clause else
La clause else (traduire par sinon), ajoutée après l'accolade fermante du bloc if(), permet de définir une série d'instructions qui seront exécutées si l'expression testée est fausse (renvoie FALSE). Reprenons notre exemple précédent pour illustrer son fonctionnement.
Utilisation de la clause else dans notre exemple précédent<?php// Déclaration d'une variable$vitesse = 40;// On teste la valeur de la variableif($vitesse > 50){echo 'Les policiers m\'arrêtent !';echo 'Je perds 1 point pour excès de vitesse !';echo 'Le policier me dit : "Roulez doucement maintenant !"';}else{echo 'Les policiers me laissent suivre ma route !';}?>
Nous avons ajouté la clause else dans notre code et actualisé la valeur de la variable $vitesse (40 Km/h). Lorsque l'on exécute ce code, la condition n'est pas franchie puisque 40 n'est pas supérieur à 50 donc on entre dans la clause else et on exécute la seule instruction echo().
L'instruction elseif()
Elle peut se traduire par « ou si ». Cette instruction se place obligatoirement après l'accolade fermante d'un bloc if(). Elle permet notamment d'éviter une imbrication de blocs conditionnels if() et il est possible d'en cumuler plusieurs. Aggrémentons encore notre exemple avec cette instruction conditionnelle.
Exemple d'utilisation de l'instruction conditionnelle elseif()<?php// Déclaration d'une variable$vitesse = 82;// On teste la valeur de la variableif($vitesse > 50 && $vitesse < 70){echo 'Les policiers m\'arrêtent !';echo 'Je perds 1 point pour excès de vitesse !';echo 'Le policier me dit : "Roulez doucement maintenant !"';}elseif($vitesse > 70 && $vitesse < 80){echo 'Les policiers m\'arrêtent !';echo 'Je perds 2 points pour excès de vitesse !';echo 'Le policier me verbalise par une amende';}elseif($vitesse > 80 && $vitesse < 90){echo 'Les policiers m\'arrêtent !';echo 'Je perds 3 points pour excès de vitesse !';echo 'Le policier me verbalise par une grosse amende !"';}elseif($vitesse > 90){echo 'Les policiers m\'arrêtent !';echo 'Je perds 4 points pour excès de vitesse !';echo 'Le policier me retire mon permis !';echo 'Je finis à pied !';}else{echo 'Les policiers me laissent suivre ma route !';}?>
Dans cet exemple, nous simulons la perte de points sur le permis de conduire en fonction de la vitesse. La vitesse maximale autorisée est toujours de 50 Km/h. Nous roulons à 82 Km/h, soit 32 Km/h de plus que la vitesse maximale autorisée. Nous allons donc entrer dans le second bloc d'instruction elseif() car 82 est compris entre 80 et 89 (90 exclus). Nous perdons alors 3 points sur notre permis de conduire et l'on récupère aussi une amende à payer.
D'un point de vue interprétation, PHP va tester une à une les conditions. Si la première est fausse, il passe à la seconde. Si la seconde est fausse, il passe à la troisième et ainsi de suite. S'il en rencontre une de vraie, alors il entre dedans et exécute le bloc d'instructions. Si aucune n'est vraie, il finit par exécuté le bloc d'instructions de la clause else.
Syntaxe alternative sur une ligne
Note : dans le cas où nous n'avons qu'une seule instruction à executer par instruction conditionnelle, nous pouvons nous passer des accolades. Ainsi, nous écrirons par exemple :
Exemple d'utilisation des écritures d'instructions sur une seule ligne<?php// Déclaration d'une variable$vitesse = 82;// On teste la valeur de la variableif($vitesse > 50 && $vitesse < 70)echo 'Je perds 1 point pour excès de vitesse !';elseif($vitesse > 70 && $vitesse < 80)echo 'Je perds 2 points pour excès de vitesse !';elseif($vitesse > 80 && $vitesse < 90)echo 'Je perds 3 points pour excès de vitesse !';elseif($vitesse > 90)echo 'Je perds 4 points pour excès de vitesse !';elseecho 'Je fais des appels de phares aux automobilistes !';?>
Néanmoins, nous vous recommandons toujours d'utiliser les accolades qui rendent la relecture du code plus aisée.
L'instruction switch()
Il existe une autre alternative à la structure if() / elseif() / else ou bien aux imbrications de blocs if(). Elle se nomme switch() (traduire par au cas où). Cette instruction conditionnelle permet de tester toutes les valeurs possibles que peut prendre une variable. Voici sa syntaxe.
Syntaxe de l'instruction conditionnelle switch()switch(expression){case valeur1 :instructions;break;case valeur2 :instructions;break;default :instructions;break;}
Illustrons son utilisation avec un nouvel exemple. Le précédent n'étant pas adapté. Nous allons modélisé un jeu vidéo. Le joueur doit choisir son personnage (avatar).
Exemple d'utilisation de l'instruction conditionnelle switch()<?php// Le joueur a choisi son personnage ('elfe')$personnage = 'elfe';// Test de la valeur du personnageswitch($personnage){case 'sorcier' :echo 'Vous avez choisi le sorcier !';echo 'Vous disposez de pouvoirs magiques.';break;case 'guerrier' :echo 'Vous avez choisi le guerrier !';echo 'Vous disposez d\'armes blanches.';break;case 'roi' :echo 'Vous avez choisi le roi !';echo 'Vous vivez dans un château entouré de gardes.';break;case 'elfe' :echo 'Vous avez choisi l\'elfe !';echo 'Vous pouvez voler et vous déplacer rapidement.';break;case 'ogre' :echo 'Vous avez choisi l\'ogre !';echo 'Vous avez beaucoup de force dans les bras.';break;default :echo 'Veuillez choisir votre personnage svp !';break;}?>
Si la variable a une valeur non définie dans le switch(), alors un bloc default lance une suite d'instructions. Le mot-clé case définit la valeur à tester. Cette valeur succède ce mot-clé. Le mot-clé break, quant à lui, permet de sortir du bloc switch() si l'on a exécuté un bloc d'instructions. Il est facultatif mais vivement conseillé dans la majorité des cas d'utilisation.
Il est également recommandé de toujours prévoir un bloc default pour s'assurer que l'on ait une action par défaut si la valeur de la variable n'est pas référencée dans le switch(). Cela pourrait vous éviter bien des surprises.
Conclusion
Ce cours nous a permis d'apprendre à utiliser les principales instructions conditionnelles utiles en programmation PHP. Il s'agit des blocs d'instruction if(), elseif(), else et switch(). PHP inclut également d'autres structures de contrôle qui sont les boucles. Nous les étudierons dans le chapitre suivant.
Les commentaires
2. Par Emacs le 19/11/2007 21:41
Wai mais bon niveau qualité du code je doute que ce soit terrible pour se relire derrière...
3. Par Mickaël Wolff le 20/11/2007 21:05
Ça dépend où on l'utilises. Je l'utilises surtout en phase de développement, lorsque je dois sauter beaucoup de code avec /* */, et qu'il y a alors des commentaires imbriqués.
4. Par saturn2 le 27/12/2007 21:52
très bon tuto, bravo
5. Par Michael le 29/06/2008 17:40
Lecture toujours agréable.
Les débutants en PHP regretterons une coquille : les ' non échappés.
Merci pour le temps passé à écrire tout ca !
6. Par Emacs le 30/06/2008 09:12
@Michael : les échappements des apostrophes étaient bien présents mais ont du sauter au moment de l'enregistrement. C'est corrigé. En tout cas, merci pour tous ces encouragements
7. Par Zack le 07/08/2008 20:46
Très bon tutoriel.
La traduction de "Else" n'est pas "Alors", ce n'est pas plutôt "Sinon" ?
8. Par Emacs le 08/08/2008 01:18
Merci Zack ! Oups c'est vrai, erreur de ma part que je corrige sur le champ
9. Par Jean Clément le 05/11/2008 14:26
Je n'ai pas vu l'opérateur ternaire de condition : "(condition)? (valeur vraie): (valeur fausse)"
Bien utilisé, il améliore la lisibilité d'un programme.
10. Par max8371 le 30/01/2009 22:52
merci pour ce tuto, bonnes morales
Quelle aisance dans l'expression ! Beau travail dois-je dire après cette deuxième soirée à le découvrir.
11. Par Emacs le 31/01/2009 17:06
Merci beaucoup Max
12. Par Tim le 04/02/2009 09:03
Merci pour ce tuto!
Très bien fait, très bien expliqué et à la porté de tous.
13. Par enima le 07/03/2009 15:22
Merci beaucoup pour ce tutoriel
14. Par alibaba le 28/06/2009 17:56
Salut Emacs!
Je signale une petite faute :
Le mot clé if() signifie en anglais si.
Le mot clé if() signifie en français si.
A remplacer 'anglais' par 'français' logique non?
Else bon tuto!!!
15. Par Ismael++ le 10/07/2009 20:16
Est-ce que ne pas mettre de "break" après un "default" pose un problème?
16. Par Dominique le 07/10/2009 20:38
Bravo pour ce tuto, je le trouve trés bien fait pour un débutant comme moi
1. Par Mickaël Wolff le 19/11/2007 18:17