Conditions Et Operateurs

Vous êtes ici : >> PHP / Conditions Et Operateurs
Temps d'étude : 1h. Niveau : Moyen.
Tags : Conditions Et Operateurs
Fichier(s) utile(s) pour ce cours : /

Les Conditions

Les conditions est l'un des chapitres clé de notre apprentissage, c'est aussi un sujet présent dans tous les autres langages de programmation.
Par exemple, lorsque vous créerez un site web et que l'un de vos internautes voudra se connecter à son espace de profil, il rentrera son pseudo ainsi que son mot de passe (normal, comme partout).
Il faudra exprimer la phrase suivante en PHP : "si (if) tu as un bon pseudo et un bon mot de passe, je te laisse rentrer dans ton espace de profil, sinon (else) tu resteras sur la page de connexion avec un message d'erreur".

en clair, il faut voir une condition comme une intersection dans la ville pour une voiture, plusieurs routes existent et en fonction de la situation, l'une des deux routes sera utilisée :

explication PHP

Avant de voir cela plus en détail par le code, voyons les conditions mises à notre disposition :

Condition Signification
if si
else sinon
elseif sinon si

Les Opérateurs

Voici les opérateurs mis à notre disposition :

Opérateur Signification
= est égal
== comparaison de la valeur
=== comparaison de la valeur et du type
!= différent de
! n'est pas
> supérieur à ...
< inférieur à ...
>= supérieur ou égal à ...
<= inférieur ou égal à ...
&&
AND
et
||
OR
ou
XOR ou exclusif


La condition IF/ELSE

entrainement.php
	<?php
	$a = 10; 
	$b = 5; 
	$c = 2;
	
	if($a > $b) // Si A est supérieur à B
	{
		echo "A est bien supérieur à B 
"; } else // Sinon ... A n'est pas supérieur à B { echo "non, c'est B qui est supérieur à A
"; }
Nous déclarons 3 variables avec :
  • A égal à 10

  • B égal à 5

  • C égal à 2

Ensuite, nous demandons si la variable A est bien supérieure à B, en clair : est-ce que 10 est supérieur à 5 ?
Oui, 10 est plus grand que 5 ! alors la condition renvoie TRUE (vrai) et nous rentrons dans les accolades du IF.

résultat

A est bien supérieur à B


Si nous rentrons dans le IF, nous ne pouvons pas rentrer dans le ELSE. C'est soit l'un, soit l'autre.

L'instruction ELSE fonctionne après un IF et exécute les instructions correspondantes au cas où la condition du IF est fausse.

fléche Informations
Le ELSE n'a jamais de parenthèse ni de condition particulière, il s'agit du cas par défaut.


La condition avec AND (&&)

Voici un exemple avec une double condition devant être parfaitement valable :

entrainement.php
	<?php	
	if($a > $b && $b > $c) // Si A est supérieur à B et que dans le même temps B est supérieur à C
	{
		echo "A est supérieur à B, ET, B est supérieur à C 
"; }

Nous pouvons mettre plusieurs lignes de traitement dans les accolades si nous en avions la nécessité

Cette fois ci, nous demandons si A est supérieur à B, donc : est-ce que 10 est plus grand que 5 ?
Et aussi, si B est supérieur à C, ce qui donne : est-ce que 5 est supérieur à 2 ?
Oui A est plus grand que B, et dans le même temps, B est supérieur à C ! Donc la condition renvoie TRUE (vrai) et nous rentrons dans les accolades du IF.

résultat

A est supérieur à B, ET, B est supérieur à C


Notez qu'il n'y a pas de ELSE, il est possible de faire un IF sans ELSE.
Ca ressemblerait plutôt à ça au niveau de notre route :

explication PHP

en clair, nous devons continuer tout droit, mais toutefois si la condition renvoie vrai, nous serions alors déviés de notre chemin pour aller sur une autre route.

Avec le signe && (pronnoncé AND, et commercial, esperluette), il faut absolument que les 2 conditions soient bonnes pour que l'évaluation du code retourne TRUE et que l'on puisse rentrer dans les accolades du IF.


La condition avec OR (||)

Voici un exemple avec une double condition (où l'une des deux doit au minimum être valable) :

entrainement.php
	<?php	
	if($a == 9 || $b > $c) // Si A contient 9 ou que B est supérieur à C
	{
		echo "Au moins l'une des 2 conditions est bonne (ou peut-être les 2), sinon vous ne me verriez pas m'afficher ! 
"; }

Cette fois ci, nous demandons si A est égal à 9, donc : est-ce qu'il y a 9 dans A ?
Et aussi, si B est supérieur à C, ce qui donne : est-ce que 5 est supérieur à 2 ?
Non A n'est pas égal à 9 (mais a 10), par contre B est bien supérieur à C ! Donc le fait qu'au moins l'une des deux conditions renvoie TRUE (vrai) cela nous permet de rentrer dans les accolades du IF.

résultat

Au moins l'une des 2 conditions est bonne (ou peut-être les 2), sinon vous ne me veriez pas m'afficher !


Si nous ne rentrions pas dans le IF, l'intérpréteur continuerait d'évaluer la suite du script en ignorant cette partie de notre code.

Pour rappel, voici les variables que nous avions déclarées précédemment :
	<?php
	$a = 10; 
	$b = 5; 
	$c = 2;
Notez qu'il n'y a pas de ELSE, il est possible de faire un IF sans ELSE.

Avec le signe || (prononcé OR, ou), il faut qu'au moins l'une des 2 conditions soit bonne pour que l'évaluation du code retourne TRUE et que l'on puisse rentrer dans les accolades du IF.

Si les 2 conditions étaient bonnes en même temps, nous serions aussi rentrés dans le IF, exemple :

entrainement.php
	<?php	
	if($a == 10 || $b > $c) // Si A contient 10 ou que B est supérieur à C
	{
		echo "Au moins l'une des 2 conditions est bonne (ou peut-être les 2), sinon vous ne me veriez pas m'afficher ! 
"; }

A est bien égal à 10.
B est bien supérieur à C.
Comme tout à l'heure, nous rentrons dans le IF.

Différence entre AND (&&) et OR (||)

Dans le cas du AND, il faut absolument que les 2 conditions soient bonnes pour rentrer dans le IF.
Dans le cas du OR, les 2 conditions (ou seulement l'une des 2 conditions) doivent être bonnes pour rentrer dans le IF.


La condition XOR

Voici un exemple avec une double condition (où l'une des deux doit obligatoirement être valable) :

entrainement.php
	<?php	
	if($a == 10 XOR $b == 6) // XOR : seulement l'une des 2 conditions doit être valide.
	{
		echo 'Une seule des 2 conditions est bonne !
'; }

Nous demandons si A est égal à 10, donc : est-ce qu'il y a 10 dans A ?
Ensuite nous demandons si B est égal à 6, donc : y'a t'il 6 dans B ?
Oui A est égal à 10 mais B n'est pas égal à 6.

L'une des 2 conditions est bonne, l'autre pas. C'est parfait ! c'est précisément ce dont nous avons besoin pour rentrer dans le IF.

Si les 2 conditions sont bonnes, nous ne rentrons pas dans le IF.
Si les 2 conditions sont mauvaises, nous ne rentrerons pas dans le IF.
Avec XOR, il faut précisément qu'une seule des 2 condition soit bonne pour rentrer dans le IF.

résultat

Une seule des 2 conditions est bonne !


Son utilisation est un peu plus rare mais très utile dans certains cas très spécifiques !

Les conditions avec IF / ELSEIF / ELSE

Voici un exemple avec une condition comprennant plusieurs cas :

entrainement.php
	<?php	
	if($a == 8) // le double égal (==) permet de vérifier une information à l'intérieur d'une variable
	{
		echo "1 - A est égal à 8";
	}
	elseif($a != 10) // SinonSi A est différent de 10
	{
		echo "2 - A est différent de 10";
	}
	else // Sinon, c'est que je ne suis ni tombé dans le if, ni dans le elseif, je me trouve donc ici dans le else.
	{
		echo "3 - tout le monde a faux A n'est pas égal a 8 et n'est pas différent de 10. Du coup c'est moi le else qui gagne !
"; }

IF : Nous demandons si A est égal à 8, donc : est-ce qu'il y a 8 dans A ?
ELSEIF : Sinon si, est-ce que A est différent de 10 ?
ELSE : Sinon, si les 2 conditions d'au dessus ne sont pas bonnes, nous tomberons dans le else (cas par défaut). Non A n'est pas égal à 8 (mais a 10), A n'est pas non plus différent de 10 ! Du coup nous tomberons forcément dans le cas par défaut, le ELSE.

résultat

3 - tout le monde a faux A n'est pas égal a 8 et n'est pas différent de 10. Du coup c'est moi le else qui gagne !


Nous aurions pu mettre plusieurs elseif d'affilée, le nombre n'est pas limité.

Pour imager le code, voici ce que cela donne au niveau de notre route :

explication PHP

Si nous ne rentrons pas dans le IF, ni dans le ELSEIF, nous rentrons forcément dans le ELSE, c'est le cas par défaut (la route restante, puisque nous ne pouvons pas revenir en arrière).



Condition IF / ELSE sous forme contracté

Voici un exemple avec une condition sous forme contracté :

entrainement.php
	<?php	
	echo ($a == 10) ? "A est égal à 10
" : "A n'est pas égal à 10
";

Le ? (point d'intérogation) remplace le IF, le : (double point) remplace le else.

Nous ne garderons pas forcément cette forme d'écriture durant le cours mais il est utile d'en avoir connaissance si vous récupérez du code écrit par d'autres développeurs (utilisant les formes contractées) qu'il faudra comprendre.

Si A est égal à 10, nous rentrons dans le IF (point d'intérogation "?").
Sinon, A n'est pas égal à 10, nous rentrons dans le ELSE (double point ":").
résultat

A est égal à 10



Condition de comparaison

Voici un exemple avec une condition de comparaison :

entrainement.php
	<?php	
	$vara = 1;
	$varb = "1";
	if($vara == $varb)
	{
		echo "il s'agit de la même valeur";
	}

Nous demandons si la $vara contient la même valeur que la $varb.
Oui c'est bien, le cas, dans les deux variables se trouve la valeur 1.

résultat

il s'agit de la même valeur


entrainement.php
	<?php	
	$vara = 1;
	$varb = "1";
	if($vara === $varb)
	{
		echo "il s'agit de la même valeur et du même type";
	}

résultat

Le résultat est vide dans la mesure où la condition renvoie FALSE (faux), nous ne rentrons pas dans le IF, par conséquent le echo ne se déclenchera pas.
Nous demandons si la $vara contient la même valeur et le même type que la $varb.
Non ce n'est pas le cas, la $vara contient le chiffre 1 et est de type integer, la $varb contient le chiffre 1 et est de type string.

Comme vous avez pu le constater, dans notre code la variable $vara contient un 1 qui a été affecté normalement comme un chiffre (sans quotes ni guillemets).
La variable $varb contient un 1 qui a été affecté comme un string (une chaine de caractères), avec des guillemets.
L'interpréteur ne fait pas de différenciation de type avec le double égal, mais avec le triple égal il voit une différence et n'est pas d'accord pour dire que le type est le même.

Différence entre 1 égal, 2 égals et 3 égals en PHP ?

Opérateur Signification
= 1 égal permet de faire une affectation de valeur à une variable
== 2 égals permettent de faire une comparaison de la valeur et poser une question, par exemple : y'a t'il 1 dans la variable ?
=== 3 égals permettent de faire une comparaison de la valeur et du type eafin de poser une question, par exemple : y'a t'il 1 dans la variable et est-elle de type integer ?

Condition Switch

Lorsque vous avez un grand nombre de conditions à tester (supérieur à 3), nous utilisons généralement la structure conditionnelle SWITCH.

Voici ce que le code donnerait avec les structures que nous connaissons IF, ELSEIF, ELSE :

entrainement.php
	<?php	
	$monPays = 'France';
	
	if($monPays == 'Italie')
	{
		echo 'vous êtes Italien!
'; } elseif($monPays == 'Espagne') { echo 'vous êtes Espagnol!
'; } elseif($monPays == 'Angleterre') { echo 'vous êtes Anglais!
'; } elseif($monPays == 'France') { echo 'vous êtes Français!
'; } elseif($monPays == 'Suisse') { echo 'vous êtes Suisse!
'; } else { echo 'vous n\'avez pas une nationalité connu dans notre liste de possibilités
'; }

résultat

vous êtes Français!


S'il y a beaucoup de tests à réaliser, l'utilisation de IF, ELSEIF, ELSE va être assez contraignante et peu optimisée pour les performances (temps d'exécution du serveur plus faible une fois le code mis en ligne avec des multi connexions).

Par conséquent, retenez que dans le cas d'un grand nombre de conditions à tester, il sera préférable d'utiliser la structure conditionnelle switch :

entrainement.php
	<?php	
	$monPays = 'France';
	
	switch($monPays)
	{
		case 'Italie':
			echo 'vous êtes Italien!
'; break; case 'Espagne': echo 'vous êtes Espagnol!
'; break; case 'Angleterre': echo 'vous êtes Anglais!
'; break; case 'France': echo 'vous êtes Français!
'; break; case 'Suisse': echo 'vous êtes Suisse!
'; break; default: echo 'vous n\'avez pas une nationalité connu dans notre liste de possibilités
'; break; }

Je vous recommande d'être particulièrement vigilant(e) à l'écriture du code dans le mesure où nous alternons des quotes, des point-virgule, des doubles-point, des accolades, des parenthèses, etc.

résultat

vous êtes Français!



Explications
Nous inscrivons la variable à tester dans les parenthèses de la structure switch.

Nous listons tous les cas à tester avec le mot-clé case et nous délimitons un cas avec le mot-clé break (en remplacement des accolades habituelles).

Le cas par défaut (équivalent du else) est mentionné par le mot-clé default.

Différence entre IF et ELSEIF

Beaucoup diront "c'est bon, pas besoin d'expliquer pendant 2 jours ce que veut dire IF et ELSE, on a capté !" mais il est très important de ne pas confondre les IF et les ELSEIF, et par dessus tout, comprendre pourquoi.

La différence entre IF et ELSEIF :

Les instructions IF seront toutes testées à la chaine, les unes après les autres.
Les instructions ELSEIF seront testées uniquement si les conditions au dessus n'ont pas été évaluées comme TRUE (vrai) et n'ont pas donné satisfaction.

Pour mieux comprendre, voici un exemple avec une série de conditions comprennant plusieurs IF et un ELSE à la fin :

entrainement.php
	<?php	
	$couleur = 'bleu';
	
	if($couleur == 'bleu')
	{
		echo 'votre couleur est préférée est le bleu.
'; } if($couleur == 'orange') { echo 'votre couleur est préférée est le orange.
'; } if($couleur == 'rose') { echo 'votre couleur est préférée est le rose.
'; } else { echo 'nous n\'arrivons pas à determiner votre couleur préférée !!
'; }

Qu'est-ce que donne ce code ? Voyons ça tout de suite...

résultat

votre couleur est préférée est le bleu.

nous n'arrivons pas à determiner votre couleur préférée !!



Explications
Et oui, vous ne vous trompez pas, le if de la couleur bleue est bien exécuté, mais aussi le else de fin.

Pourquoi ? Et bien c'est simple, l'interpréteur lit les instructions séquentiellement.
Ligne 4 : il voit que la couleur est bleu et rentre dans le IF.
Ligne 8 : la couleur n'est pas orange et ne rentre pas dans le IF.
Ligne 12 : la couleur n'est pas rose et ne rentre pas dans le IF.
Ligne 16 : Puisque la couleur n'était pas rose (cas juste au dessus), il rentre dans le ELSE (cas par défaut) car chaque else se réfère au IF qui le précède !

C'est donc un problème ! voyons plutôt ce code :

entrainement.php
	<?php	
	$couleur = 'bleu';
	
	if($couleur == 'bleu')
	{
		echo 'votre couleur est préférée est le bleu.
'; } elseif($couleur == 'orange') { echo 'votre couleur est préférée est le orange.
'; } elseif($couleur == 'rose') { echo 'votre couleur est préférée est le rose.
'; } else { echo 'nous n\'arrivons pas à determiner votre couleur préférée !!
'; }

Cette fois ce code est mieux formulé, voyons ce que ça donne :

résultat

votre couleur préférée est le bleu



Explications
Ligne 4 : il voit que la couleur est bleu et rentre dans le IF.
Ligne 8 : il ne cherche pas à rentrer dans un ELSEIF puisque le IF a été évalué comme étant positif (TRUE, vrai).
Ligne 12 : il ne cherche pas à rentrer dans un ELSEIF puisque le IF a été évalué comme étant positif (TRUE, vrai).
Ligne 16 : il ne cherche pas non plus à rentrer dans un ELSE puisque le IF a été évalué comme étant positif (TRUE, vrai).

En conclusion, nous pouvons dire qu'il y a une réelle et importante différence entre IF et ELSEIF.

Si votre objectif est de prévoir qu'un seul cas possible pour vos conditions, vous devrez privilégier la structure IF / ELSEIF / ELSE ou éventuellement la structure conditionnelle SWITCH.

explication PHP