Ecrire des conditions condensées avec les opérateurs ternaire et fusion null

Dans cette nouvelle leçon, nous allons étudier en détail deux opérateurs de comparaison qu’on a jusqu’à présent laissé volontairement de côté : l’opérateur ternaire ? : et l’opérateur fusion null ??.

Ces deux opérateurs vont nous permettre d’écrire des conditions plus condensées et donc d’alléger nos scripts et de gagner du temps en développement.

 

L’opérateur ternaire et les structures conditionnelles ternaires

Les structures conditionnelles ternaires (souvent simplement abrégées “ternaires”) correspondent à une autre façon d’écrire nos conditions en utilisant une syntaxe basée sur l’opérateur ternaire ? : qui est un opérateur de comparaison.

Les ternaires vont utiliser une syntaxe très condensée et nous allons ainsi pouvoir écrire toute une condition sur une ligne et accélérer la vitesse d’exécution de notre code.

Avant de vous montrer les écritures ternaires, je dois vous prévenir : beaucoup de développeurs n’aiment pas les ternaires car elles ont la réputation d’être très peu lisibles et très peu compréhensibles.

Ce reproche est à moitié justifié : d’un côté, on peut vite ne pas comprendre une ternaire si on est un développeur moyen ou si le code qui nous est présenté n’est pas ou mal commenté. De l’autre côté, si vous indentez et commentez bien votre code, vous ne devriez pas avoir de problème à comprendre une structure ternaire.

Il reste cependant fortement recommandé de ne pas imbriquer les structures ternaires les unes dans les autres tout simplement car votre code deviendrait vite illisible et car le comportement de PHP lors de l’utilisation de plus d’un opérateur ternaire dans une seule instruction n’est pas évident.

Les structures ternaires vont se présenter sous la forme suivante : test ? code à exécuter si true : code à exécuter si false.

Illustrons immédiatement cela avec un exemple :

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $x = 4; //On affecte la valeur 4 à $x
            
            //Ecrire ceci :
            if($x >= 0){
                echo '$x stocke un nombre positif<br>';
            }else{
                echo '$x stocke un nombre négatif<br>';
            }
            
            //Est equivalent à cela :
            echo $x >= 0 ? '$x stocke un nb positif' : '$x stocke un nb négatif'; 
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de l'opérateur ternaire en PHP

Notez également qu’on va pouvoir abréger encore plus nos ternaires en omettant la partie centrale de l’opérateur ternaire, c’est-à-dire le code entre le point d’interrogation et les deux points.

En utilisant cette écriture, c’est la partie située avant l’opérateur qui sera renvoyée si le test est évalué à true et la partie après l’opérateur sinon.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $x = 4; //On affecte la valeur 4 à $x
            
            //Ecrire ceci :
            if($x >= 0){
                echo ($x >= 0).'<br>';
            }else{
                echo '$x stocke un nombre négatif<br>';
            }
            
            //Est equivalent à cela :
            echo $x >= 0 ?: '$x stocke un nb négatif'; 
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Syntaxe raccourcie de l'opérateur ternaire en PHP

Ici, il faut bien comprendre que PHP ne va pas renvoyer le contenu de $x mais le résultat de la comparaison $x >= 0, c’est-à-dire true, convertie sous forme d’entier (c’est-à-dire 1).

On est ici obligés d’utiliser un couple de parenthèses dans notre instruction if pour que le point soit bien considéré comme un opérateur de concaténation et pas comme appartenant à 0.

 

L’opérateur fusion null

L’opérateur fusion null ?? ressemble dans sa syntaxe et dans son fonctionnement à l’opérateur ternaire.

Cet opérateur utilise la syntaxe suivante : test ?? code à renvoyer si le résultat du test est NULL.

Si l’expression à gauche de l’opérateur vaut NULL, alors l’expression à droite de l’opérateur sera renvoyée. Dans tous les autres cas, c’est l’expression à gauche de l’opérateur qui sera renvoyée.

On va généralement utiliser cet opérateur pour tester si une variable contient quelque chose ou pas et, dans le cas où la variable est vide, lui faire stocker une valeur.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $x = 4; //On affecte la valeur 4 à $x
            $y = NULL;
            $z;
            
            $resultatx = $x ?? 'NULL';
            $resultaty = $y ?? 'NULL';
            $resultatz = $z ?? 'NULL';
            
            echo '$x contient ' .$resultatx. '<br>
                  $y contient ' .$resultaty. '<br>
                  $z contient ' .$resultatz;
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de l'opérateur fusion null en PHP

Ici, on teste nos variables $x, $y et $z en utilisant l’opérateur fusion null. Si la variable est vide ou contient NULL, la valeur NULL sera renvoyée et stockée dans $resultatx, code>$resultaty ou code>$resultatz. Dans le cas contraire, c’est le contenu de la variable qui sera stocké.

On affiche ensuite le contenu de nos variables stockant les résultats suite à l’utilisation de l’opérateur fusion null en utilisant echo.

Laisser un commentaire