Gérer plusieurs chemins avec elseif
Objectif de la leçon
Continuer dans le même fichier index.php avec l’état réel du fil rouge, comprendre pourquoi if et else ne suffisent pas toujours, utiliser elseif pour ajouter un chemin intermédiaire, comprendre l’ordre d’évaluation des conditions et produire un message différent selon que la conversion PHP n’a pas commencé, est en cours ou est terminée.
Explications
Avant de commencer
Dans la leçon précédente, nous avons écrit nos premières conditions avec :
if
et :
else
Le dossier du fil rouge contient toujours notamment :
index.html
index.php
apropos.html
contact.html
ordinateur.jpg
styles.css
Au début de :
index.php
nous pouvons maintenant avoir :
<?php
$nomSite = 'Mon premier site HTML';
$nombrePages = 3;
$pagesConvertiesPhp = 1;
$pagesRestantes = $nombrePages - $pagesConvertiesPhp;
$messageAccueil = 'Le site possède ' . $nombrePages . ' pages principales et il reste ' . $pagesRestantes . ' pages à faire évoluer vers PHP.';
$progressionCommencee = $pagesConvertiesPhp > 0;
$conversionTerminee = $pagesRestantes === 0;
if ($conversionTerminee)
{
$messageConversion = 'La conversion PHP du site est terminée.';
}
else
{
$messageConversion = 'La conversion PHP du site est encore en cours : ' . $pagesRestantes . ' pages restent à faire évoluer.';
}
$formulaireTraite = false;
$formulaireEnAttente = $formulaireTraite === false;
$dernierMessage = null;
$aucunMessage = $dernierMessage === null;
?>
Avec cette structure, nous savons gérer deux situations :
conversion terminée
ou
conversion non terminée
Mais la deuxième situation regroupe en réalité plusieurs états.
La conversion peut :
- ne pas avoir commencé ;
- avoir commencé sans être terminée.
Nous allons donc ajouter un troisième chemin.
Dans cette première leçon du nouveau chapitre, nous allons répondre à quatre questions :
- Pourquoi
ifet
else ne suffisent-ils pas toujours ?
- Quel est le rôle de
elseif ?
- Dans quel ordre PHP teste-t-il plusieurs conditions ?
- Comment distinguer trois états réels du même projet ?
À la fin de cette leçon, PHP produira un message différent pour :
0 page convertie
1 ou 2 pages converties
3 pages converties
sans introduire encore les opérateurs logiques.
1. Revenir sur la limite de if et else
Nous avons :
if ($conversionTerminee)
{
...
}
else
{
...
}
Cette structure propose deux chemins.
Le premier correspond à :
conversion terminée
Le second correspond à :
tout le reste
Mais :
tout le reste
peut contenir plusieurs situations différentes.
2. Observer les trois états possibles
Notre site possède :
3
pages principales.
Nous pouvons donc imaginer :
$pagesConvertiesPhp = 0;
= la conversion n’a pas commencé
$pagesConvertiesPhp = 1;
= la conversion est en cours
$pagesConvertiesPhp = 3;
= la conversion est terminée
Nous voulons maintenant que PHP distingue clairement ces trois états.
3. Découvrir elseif
PHP permet d’ajouter une nouvelle condition entre :
if
et :
else
avec :
elseif
Nous pouvons représenter la structure ainsi :
if
= premier chemin
elseif
= chemin intermédiaire
else
= dernier chemin
4. Écrire une première structure à trois chemins
Nous pouvons faire évoluer notre condition ainsi :
if ($conversionTerminee)
{
$messageConversion = 'La conversion PHP du site est terminée.';
}
elseif ($progressionCommencee)
{
$messageConversion = 'La conversion PHP du site est en cours.';
}
else
{
$messageConversion = 'La conversion PHP du site n’a pas encore commencé.';
}
Nous allons maintenant la lire lentement.
5. Le premier if reste prioritaire
PHP commence par :
if ($conversionTerminee)
Il vérifie donc d’abord :
la conversion est-elle terminée ?
Avec l’état actuel :
$pagesConvertiesPhp = 1;
$pagesRestantes = 2;
$conversionTerminee = false;
la réponse est :
false
PHP ne prend donc pas le premier chemin.
6. PHP passe ensuite au elseif
Comme le premier
if est faux, PHP examine :
elseif ($progressionCommencee)
Nous avons :
$progressionCommencee = $pagesConvertiesPhp > 0;
Avec :
$pagesConvertiesPhp = 1;
la comparaison produit :
true
Le bloc du
elseif est donc exécuté.
7. Le bloc else n’est plus testé ensuite
Une fois qu’un chemin a été choisi dans cette chaîne :
if
elseif
else
PHP n’exécute pas les blocs suivants de la même chaîne.
Dans notre état actuel :
if
= false
elseif
= true
Le bloc
elseif est exécuté.
Le bloc
else est ignoré.
8. Un seul chemin est choisi
Retenez cette règle :
dans une chaîne if / elseif / else,
PHP exécute le premier bloc dont la condition convient
Si aucune condition n’est vraie,
et qu’un
else existe,
le bloc
else est exécuté.
9. Améliorer le message du chemin intermédiaire
Nous pouvons maintenant réutiliser :
$pagesRestantes
pour produire un message plus précis.
Remplaçons :
$messageConversion = 'La conversion PHP du site est en cours.';
par :
$messageConversion = 'La conversion PHP du site est en cours : ' . $pagesRestantes . ' pages restent à faire évoluer.';
Avec l’état actuel, le résultat est :
La conversion PHP du site est en cours : 2 pages restent à faire évoluer.
10. Premier état : conversion terminée
Imaginons temporairement :
$pagesConvertiesPhp = 3;
Nous obtenons :
$pagesRestantes = 0;
$conversionTerminee = true;
$progressionCommencee = true;
Deux booléens sont donc vrais :
$conversionTerminee
$progressionCommencee
Mais PHP commence par :
if ($conversionTerminee)
Ce premier test est vrai.
Le message devient :
La conversion PHP du site est terminée.
Le
elseif n’est pas exécuté.
11. Pourquoi l’ordre des conditions est important
Lorsque :
$pagesConvertiesPhp = 3;
la progression a forcément commencé.
Donc :
$progressionCommencee = true
et :
$conversionTerminee = true
Si nous testions d’abord :
$progressionCommencee
PHP choisirait ce chemin immédiatement.
Il n’arriverait jamais au test :
$conversionTerminee
Nous afficherions alors un message disant que la conversion est simplement en cours, alors qu’elle est terminée.
12. Tester le cas le plus précis en premier
Nous choisissons donc cet ordre :
1. conversion terminée
2. progression commencée
3. aucun de ces deux états
Le cas :
conversion terminée
est plus précis que :
progression commencée
Nous le testons donc en premier.
Retenez surtout :
l’ordre des conditions peut changer le résultat
13. Deuxième état : conversion en cours
Revenons à l’état réel :
$pagesConvertiesPhp = 1;
Nous avons :
$conversionTerminee = false;
$progressionCommencee = true;
PHP ignore le premier bloc,
puis exécute :
elseif ($progressionCommencee)
Le message est :
La conversion PHP du site est en cours : 2 pages restent à faire évoluer.
C’est l’état que nous conserverons à la fin de la leçon.
14. Troisième état : conversion non commencée
Pour observer le troisième chemin, testez temporairement :
$pagesConvertiesPhp = 0;
Nous obtenons :
$pagesRestantes = 3;
$conversionTerminee = false;
$progressionCommencee = false;
Le
if est faux.
Le
elseif est faux.
PHP arrive donc à :
else
Le message devient :
La conversion PHP du site n’a pas encore commencé.
15. Remettre l’état réel du fil rouge
Après les tests, remettez :
$pagesConvertiesPhp = 1;
Nous devons retrouver :
$pagesRestantes = 2;
$conversionTerminee = false;
$progressionCommencee = true;
et le message :
La conversion PHP du site est en cours : 2 pages restent à faire évoluer.
16. Remplacer l’ancien if / else
Nous n’allons pas conserver deux structures différentes pour la même décision.
Remplacez l’ancien bloc :
if ($conversionTerminee)
{
...
}
else
{
...
}
par le nouveau bloc :
if ($conversionTerminee)
{
$messageConversion = 'La conversion PHP du site est terminée.';
}
elseif ($progressionCommencee)
{
$messageConversion = 'La conversion PHP du site est en cours : ' . $pagesRestantes . ' pages restent à faire évoluer.';
}
else
{
$messageConversion = 'La conversion PHP du site n’a pas encore commencé.';
}
Nous faisons évoluer la même logique.
17. Le HTML n’a pas besoin de changer
Dans le contenu principal, nous conservons :
<p><?php echo $messageAccueil; ?></p>
<p><?php echo $messageConversion; ?></p>
Le HTML ne connaît pas le chemin choisi.
Il reçoit simplement la valeur finale de :
$messageConversion
Cette séparation reste utile :
PHP
= choisir le contenu
HTML
= structurer le contenu
18. Le messageAccueil reste également intact
Nous conservons :
$messageAccueil = 'Le site possède ' . $nombrePages . ' pages principales et il reste ' . $pagesRestantes . ' pages à faire évoluer vers PHP.';
Cette variable décrit les nombres.
La variable :
$messageConversion
décrit l’état de progression.
Chaque variable conserve donc un rôle clair.
19. elseif possède sa propre condition
Dans :
elseif ($progressionCommencee)
les parenthèses contiennent une condition,
comme avec
if.
La différence est que cette condition n’est examinée que si les chemins précédents n’ont pas déjà été choisis.
20. else ne possède toujours pas de condition
Nous écrivons :
else
{
...
}
et non :
else (...)
{
...
}
Le bloc
else représente :
tous les cas restants
Il n’a donc pas besoin d’une nouvelle condition.
21. Peut-on avoir plusieurs elseif ?
Oui.
Une chaîne peut contenir plusieurs blocs :
elseif
si plusieurs états doivent être distingués.
Par exemple :
if (...)
{
...
}
elseif (...)
{
...
}
elseif (...)
{
...
}
else
{
...
}
Nous n’allons pas multiplier les chemins sans besoin réel.
Pour notre fil rouge, un seul
elseif suffit actuellement.
22. Ne pas ajouter des états artificiels
Nous pourrions inventer de nombreuses catégories de progression.
Mais notre projet possède seulement trois pages principales.
Les trois états :
pas commencé
en cours
terminé
sont suffisants et compréhensibles.
Nous cherchons toujours une logique utile au projet,
pas une démonstration compliquée pour utiliser une syntaxe.
23. Une chaîne de conditions doit rester lisible
Plus une chaîne contient de chemins,
plus l’ordre devient important.
Nous devons pouvoir expliquer chaque étape.
Dans notre cas :
si la conversion est terminée
→ message terminé
sinon, si la progression a commencé
→ message en cours
sinon
→ message pas commencé
Cette lecture correspond directement au code.
24. État final du bloc PHP
À la fin de la leçon, le début de :
index.php
peut être :
<?php
$nomSite = 'Mon premier site HTML';
$nombrePages = 3;
$pagesConvertiesPhp = 1;
$pagesRestantes = $nombrePages - $pagesConvertiesPhp;
$messageAccueil = 'Le site possède ' . $nombrePages . ' pages principales et il reste ' . $pagesRestantes . ' pages à faire évoluer vers PHP.';
$progressionCommencee = $pagesConvertiesPhp > 0;
$conversionTerminee = $pagesRestantes === 0;
if ($conversionTerminee)
{
$messageConversion = 'La conversion PHP du site est terminée.';
}
elseif ($progressionCommencee)
{
$messageConversion = 'La conversion PHP du site est en cours : ' . $pagesRestantes . ' pages restent à faire évoluer.';
}
else
{
$messageConversion = 'La conversion PHP du site n’a pas encore commencé.';
}
$formulaireTraite = false;
$formulaireEnAttente = $formulaireTraite === false;
$dernierMessage = null;
$aucunMessage = $dernierMessage === null;
?>
Dans le contenu principal :
<p><?php echo $messageAccueil; ?></p>
<p><?php echo $messageConversion; ?></p>
25. Vérifier les trois chemins
Vous pouvez maintenant tester successivement :
$pagesConvertiesPhp = 0;
puis :
$pagesConvertiesPhp = 1;
puis :
$pagesConvertiesPhp = 3;
À chaque fois, actualisez :
index.php
et observez le message.
Vous devez obtenir trois résultats différents.
26. Toujours revenir à la valeur réelle
Après les tests, conservez :
$pagesConvertiesPhp = 1;
Le fil rouge représente toujours :
index.php
= page déjà engagée dans la conversion PHP
apropos.html
= encore en HTML
contact.html
= encore en HTML
Nous ne prétendons pas que les autres pages ont déjà été transformées.
27. Le nouveau chapitre commence par affiner les décisions
Dans le chapitre précédent, nous avons appris :
if
else
Nous savons maintenant ajouter :
elseif
Le programme peut donc distinguer plus de deux situations.
Mais nous utilisons encore une seule condition à la fois dans chaque parenthèse.
28. Certaines décisions ont besoin de plusieurs critères
Plus tard, nous pourrions vouloir vérifier quelque chose comme :
la conversion a commencé
et
le formulaire est encore en attente
ou :
la conversion est terminée
ou
aucune page ne reste à faire évoluer
Pour construire ce type de condition, nous devons apprendre à combiner plusieurs expressions booléennes.
29. Ne pas combiner les conditions avant l’explication
Nous n’allons pas encore écrire :
&&
||
!
dans le code du projet.
Ces opérateurs seront expliqués dans la prochaine leçon avant toute utilisation.
Pour le moment, retenez simplement que la prochaine étape consistera à combiner plusieurs conditions déjà comprises.
30. Préparer la prochaine étape
Nous disposons maintenant de plusieurs booléens utiles :
$progressionCommencee
$conversionTerminee
$formulaireEnAttente
$aucunMessage
Ils sont parfaits pour apprendre à combiner des conditions.
Dans la prochaine leçon, nous verrons notamment comment exprimer :
condition A ET condition B
condition A OU condition B
NON condition A
Nous le ferons toujours à partir du même état du projet.
31. Ce que vous devez comprendre avant la prochaine leçon
Vous devez maintenant être capable d’expliquer :
- pourquoi
if / else ne suffit pas toujours ;
- le rôle de
elseif ;
- pourquoi
elseif possède une condition ;
- pourquoi
else n’en possède pas ;
- dans quel ordre PHP vérifie les chemins ;
- pourquoi seul le premier chemin correspondant est exécuté ;
- pourquoi l’ordre des conditions est important ;
- pourquoi nous testons
$conversionTermineeavant
$progressionCommencee ;
- quel message est choisi avec
$pagesConvertiesPhp = 0 ;
- quel message est choisi avec
$pagesConvertiesPhp = 1 ;
- quel message est choisi avec
$pagesConvertiesPhp = 3 ;
- pourquoi nous revenons à
$pagesConvertiesPhp = 1 après les tests ;
- pourquoi le HTML reste identique alors que la logique PHP devient plus précise.
Retenez surtout :
if
= premier test
elseif
= test supplémentaire si les précédents n’ont pas été retenus
else
= tous les cas restants
Dans la prochaine leçon, nous conserverons ces décisions et nous apprendrons à combiner plusieurs conditions avec les opérateurs logiques.
Exemple commenté
Nous partons de l’état réel :
$pagesConvertiesPhp = 1;
$pagesRestantes = 2;
$progressionCommencee = true;
$conversionTerminee = false;
Nous utilisons :
if ($conversionTerminee)
{
$messageConversion = 'La conversion PHP du site est terminée.';
}
elseif ($progressionCommencee)
{
$messageConversion = 'La conversion PHP du site est en cours : ' . $pagesRestantes . ' pages restent à faire évoluer.';
}
else
{
$messageConversion = 'La conversion PHP du site n’a pas encore commencé.';
}
Le premier test est faux.
Le deuxième est vrai.
PHP choisit donc :
La conversion PHP du site est en cours : 2 pages restent à faire évoluer.
Le même paragraphe HTML continue ensuite à afficher :
<p><?php echo $messageConversion; ?></p>Exercice à réaliser
Continuez dans le même fichier :
index.php
1. Conserver les données du fil rouge
Vérifiez que vous avez :
$nombrePages = 3;
$pagesConvertiesPhp = 1;
$pagesRestantes = $nombrePages - $pagesConvertiesPhp;
$progressionCommencee = $pagesConvertiesPhp > 0;
$conversionTerminee = $pagesRestantes === 0;
2. Remplacer l’ancien if / else
Utilisez :
if ($conversionTerminee)
{
$messageConversion = 'La conversion PHP du site est terminée.';
}
elseif ($progressionCommencee)
{
$messageConversion = 'La conversion PHP du site est en cours : ' . $pagesRestantes . ' pages restent à faire évoluer.';
}
else
{
$messageConversion = 'La conversion PHP du site n’a pas encore commencé.';
}
3. Vérifier l’état actuel
Avec :
$pagesConvertiesPhp = 1;
vérifiez que le chemin
elseif est choisi.
4. Tester le premier chemin
Remplacez temporairement :
$pagesConvertiesPhp = 1;
par :
$pagesConvertiesPhp = 3;
Vérifiez que le premier bloc
if est choisi.
5. Tester le dernier chemin
Remplacez temporairement la valeur par :
$pagesConvertiesPhp = 0;
Vérifiez que le bloc
else est choisi.
6. Revenir à l’état réel
Remettez :
$pagesConvertiesPhp = 1;
7. Vérifier le HTML
Conservez :
<p><?php echo $messageConversion; ?></p>
sans ajouter de condition dans le HTML.
8. Expliquer ce que vous avez fait
Sans regarder la correction, expliquez avec vos propres mots :
1. pourquoi
elseif est nécessaire ici ;
2. quel bloc est testé en premier ;
3. pourquoi
$conversionTermineedoit être testé avant
$progressionCommencee ;
4. ce qui se passe lorsqu’un
elseif est vrai ;
5. le rôle du bloc
else ;
6. pourquoi la valeur finale doit revenir à
1 ;
7. quelle notion sera nécessaire pour combiner plusieurs conditions dans la prochaine leçon.
Correction et résultat attendu
À la fin de l’exercice, le début de :
index.php
peut être :
<?php
$nomSite = 'Mon premier site HTML';
$nombrePages = 3;
$pagesConvertiesPhp = 1;
$pagesRestantes = $nombrePages - $pagesConvertiesPhp;
$messageAccueil = 'Le site possède ' . $nombrePages . ' pages principales et il reste ' . $pagesRestantes . ' pages à faire évoluer vers PHP.';
$progressionCommencee = $pagesConvertiesPhp > 0;
$conversionTerminee = $pagesRestantes === 0;
if ($conversionTerminee)
{
$messageConversion = 'La conversion PHP du site est terminée.';
}
elseif ($progressionCommencee)
{
$messageConversion = 'La conversion PHP du site est en cours : ' . $pagesRestantes . ' pages restent à faire évoluer.';
}
else
{
$messageConversion = 'La conversion PHP du site n’a pas encore commencé.';
}
$formulaireTraite = false;
$formulaireEnAttente = $formulaireTraite === false;
$dernierMessage = null;
$aucunMessage = $dernierMessage === null;
?>
Dans le contenu principal :
<p><?php echo $messageAccueil; ?></p>
<p><?php echo $messageConversion; ?></p>
Avec la valeur réelle :
$pagesConvertiesPhp = 1;
nous avons :
$conversionTerminee = false;
$progressionCommencee = true;
PHP exécute donc le bloc :
elseif
et produit :
La conversion PHP du site est en cours : 2 pages restent à faire évoluer.
Dans la prochaine leçon, nous conserverons ce nouvel état et nous apprendrons à combiner plusieurs conditions avec les opérateurs logiques.
À retenir
Cette leçon ouvre le chapitre :
Construire des décisions plus complètes
Nous avons appris que
ifet
else ne suffisent pas toujours lorsque plusieurs états doivent être distingués.
Nous avons ajouté :
elseif
pour construire trois chemins :
if
= conversion terminée
elseif
= conversion en cours
else
= conversion non commencée
Nous avons aussi appris que l’ordre des conditions compte.
Le programme teste d’abord :
$conversionTerminee
puis :
$progressionCommencee
car une conversion terminée est également une progression déjà commencée.
Avec l’état réel :
$pagesConvertiesPhp = 1;
le chemin
elseif est choisi.
Le HTML continue à afficher simplement :
<p><?php echo $messageConversion; ?></p>
La logique reste donc séparée de la structure de la page.
Dans la prochaine leçon, nous garderons plusieurs booléens déjà présents dans le fil rouge et nous apprendrons à les combiner avec les opérateurs logiques, avant de construire des décisions encore plus précises.
Seuil de réussite, en pourcentage : 100 %. QCM obligatoire pour terminer le cours.