Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

PHP : true, false et autres vérités...

Article posté le 20-11-2014 dans la catégorie PHP

Souvent je vois des erreurs de codage, bêtes, ou des personnes qui ont appris que PHP étant faiblement typé et permet de déclarer des variables n'importe où, se retrouvent "coincées" dans le cas de scripts pourtant basiques.

Voici donc un petit rappel sur la notion des booléans, de tests de conditions.

Nous allons essayer de voir tous les cas de figure :

  1. Une variable égale à 0
  2. Une variable égale à 1
  3. Une variable égale à true
  4. Une variable égale à false
  5. Une variable qui vaut null
  6. Une variable qui n'existe pas!

Tout d'abord, testons les conditions :

$varA = 0;
       $varB = 1;
       $varC = false;
       $varD = true;
       $varE = null;
       
       if($varA){
           echo '<br/>A est vrai;';
       }else{
            echo '<br/>A est faux;';
       }
       
       if($varB){
           echo '<br/>B est vrai;';
       }else{
            echo '<br/>B est faux;';
       }
       
       if($varC){
           echo '<br/>C est vrai;';
       }else{
            echo '<br/>C est faux;';
       }
       
       if($varD){
           echo '<br/>D est vrai;';
       }else{
            echo '<br/>D est faux;';
       }
       
       if($varE){
           echo '<br/>E est vrai;';
       }else{
            echo '<br/>E est faux;';
       }
       if($varF){
           echo '<br/>F est vrai;';
       }else{
            echo '<br/>F est faux;';
       }

Le résultat de l'execution du script nous donnera :

A est faux;
B est vrai;
C est faux;
D est vrai;
E est faux;
( ! ) Notice: Undefined variable: varF in C:\wamp\www\Test\Web\index.php on line 46
Call Stack
#    Time    Memory    Function    Location
1    0.0005    241184    {main}( )    ..\index.php:0

F est faux;

A noter que l'affichage du message d'erreur dépend du paramétrage de votre serveur. C'est pour cela que les "petits nouveaux" de PHP ne comprennent pas pourquoi parfois des erreurs apparaissent, d'autres fois non... En fait, il faut être clair, c'est une mauvaise pratique que de tester une variable qui n'existe pas, ce n'est pas du tout propre ni maintenable comme code!

Donc un petit tableau récapitulatif :

Test si vrai :

Contenu de la variable Valeur logique
0 False
1 True
True True
False False
Null False
Variable Non existante False

Maintenant, rentrons dans le détail, refaisons notre script avec un simple comparateur == comme on le voit dans 95% des scripts qui trainent à droite à gauche. Vous remarquez que j'ai modifié chaque cas : à présent :

  1. Je vérifie que la variable vaut True
  2. Ou alors qu'elle vaut False
  3. Ou aucun des deux !

C'est parti !

if($varA == true){
           echo '<br/>A est vrai;';
       }elseif($varA == false){
            echo '<br/>A est faux;';
       }else{
           echo '<br/>A n\'est ni vrai ni faux;';
       }
       
       if($varB == true){
           echo '<br/>B est vrai;';
       }elseif($varB == false){
            echo '<br/>B est faux;';
       }else{
           echo '<br/>B n\'est ni vrai ni faux;';
       }
       
       if($varC == true){
           echo '<br/>C est vrai;';
       }elseif($varC == false){
            echo '<br/>C est faux;';
       }else{
           echo '<br/>C n\'est ni vrai ni faux;';
       }
       
       if($varD == true){
           echo '<br/>D est vrai;';
       }elseif($varD == false){
            echo '<br/>D est faux;';
       }else{
           echo '<br/>D n\'est ni vrai ni faux;';
       }
       
       if($varE == true){
           echo '<br/>E est vrai;';
       }elseif($varE == false){
            echo '<br/>E est faux;';
       }else{
           echo '<br/>E n\'est ni vrai ni faux;';
       }
  if($varF == true){
           echo '<br/>F est vrai;';
       }elseif($varF == false){
            echo '<br/>F est faux;';
       }else{
           echo '<br/>F n\'est ni vrai ni faux;';
       }

Résultat :

A est faux;
B est vrai;
C est faux;
D est vrai;
E est faux;
( ! ) Notice: Undefined variable: varF in C:\wamp\www\Test\Web\index.php on line 56
Call Stack
#    Time    Memory    Function    Location
1    0.0011    243776    {main}( )    ..\index.php:0
( ! ) Notice: Undefined variable: varF in C:\wamp\www\Test\Web\index.php on line 58
Call Stack
#    Time    Memory    Function    Location
1    0.0011    243776    {main}( )    ..\index.php:0
F est faux;

Le résultat ne change pas! Vous remarquerez la double erreur, c'est normal, je vérifie deux fois ma variable (si elle vaut vrai puis si elle vaut faux).

Comparaison avec double égal == :

Contenu de la variable Valeur logique
0 False
1 True
True True
False False
Null False
Variable Non existante False
 

Maintenant, pour terminer, on va corser le système, est montrer ce qu'est la rigueur, et que PHP peut être lui aussi très pointilleux : nous allons comparer avec le triple égal, ===, qui vérifie valeur et type!

A n'est ni vrai ni faux;
B n'est ni vrai ni faux;
C est faux;
D est vrai;
E est faux;
( ! ) Notice: Undefined variable: varF in C:\wamp\www\Test\Web\index.php on line 56
Call Stack
#    Time    Memory    Function    Location
1    0.0016    243776    {main}( )    ..\index.php:0
( ! ) Notice: Undefined variable: varF in C:\wamp\www\Test\Web\index.php on line 58
Call Stack
#    Time    Memory    Function    Location
1    0.0016    243776    {main}( )    ..\index.php:0
F est faux;

Un peu de changement : on remarque que les variables qui valent 0 ou 1 ne sont plus dans le coup de la comparaison, et on remarque aussi que null ou undefined reviennent toujours à false !

Comparaison avec triple égal === :

Contenu de la variable Valeur logique
0 Aucune
1 Aucune
True True
False False
Null False
Variable Non existante False
 

Cet article vous a plu? Découvrez d'autres articles


Tweet
comments powered by Disqus