(expr1) ? expr2 : expr3 => opérateur ternaire

4 messages   •   Page 1 sur 1
Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 13233 Messages

07 févr. 2006, 10:09

En étudiant tel ou tel bout de code, vous avez sûrement dû tomber sur une syntaxe semblable à celle-ci:
[php]$eleve_admis = ($moyenne >= 10) ? true : false;[/php]
Et vous vous êtes sûrement demandé à quoi cela pouvait bien correspondre.

Cette expression porte le nom d'opérateur ternaire (ou affectation conditionnelle) et correspond en fait à cette syntaxe qui doit vous paraître plus familière
[php]//L'élève est admis si sa moyenne est >= à 10
if ($moyenne >= 10) {
$eleve_admis = true;
} else {
$eleve_admis = false;
}[/php]

L'expression (expr1) ? (expr2) : (expr3) renvoie la valeur de l'expression expr2 si l'expression expr1 est vraie, et l'expression expr3 si l'expression expr1 est fausse.

Pour être plus clair, cette syntaxe doit être lue Affecter la valeur "expr2" si la condition "expr1" est vraie ou la valeur "expr3" si la condition "expr1" est fausse.
Le ? vérifie si la condition testée (expr1) est vrai ou fausse. Si elle est vrai, PHP retourne la valeur suivant le ?, si elle est fausse, PHP retourne ce qui se trouve après le :.

Cette syntaxe est très pratique, entre autres, pour récupérer les valeurs d'un formulaire. Plutôt que de coder des if qui prennent 5 lignes chacun, chaque test tient sur une ligne :

[php]
$nom = (!empty($_POST["nom"])) ? $_POST["nom"] : "";
$prenom = (!empty($_POST["prenom"])) ? $_POST["prenom"] : "";
$age = (!empty($_POST["age"])) ? $_POST["age"] : "";
[/php]

Ce qui est tout de même plus clair que
[php]if (!empty($_POST["nom"])) {
$nom = $_POST["nom"];
} else {
$nom = "";
}

if (!empty($_POST["prenom"])) {
$prenom = $_POST["prenom"];
} else {
$prenom = "";
}

if (!empty($_POST["age"])) {
$age = $_POST["age"];
} else {
$age = "";
}[/php]

Depuis PHP 5.3, il existe une variante de cette syntaxe pour faciliter son utilisation : la syntaxe "?:"

Si vous utilisez l'opérateur ternaire de cette manière :
[php]
$var1 = $foo1 ? $foo1 : $default;
[/php]

Il est désormais possible d'utiliser le sucre syntaxique suivant :
[php]
$var1 = $foo1 ?: $default;
[/php]
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11396 Messages

07 févr. 2006, 11:07

:idea: Complément :

Pour ceux qui souhaitent aller encore plus loin dans l'utilisation de cet opérateur,
sachez qu'il est possible de l''imbriquer façon "poupée russe".

Les 2 écritures suivantes sont ainsi absolument identiques :
// écriture simple
echo ($condition1 ? ($condition2 ? $resultat21 : $resultat22 ) : ($condition3 ? $resultat31 : $resultat32 ) );

// écriture développée
if ($condition1)
{ if ($condition2)
{ echo $resultat21;
}
else
{ echo $resultat22;
}
}
else
{ if ($condition3)
{ echo $resultat31;
}
else
{ echo $resultat32;
}
}

:!: Limitations :
  • L'alternative ($resultat1 ou $resultat2 ?) résultant du test ($condition)
    proposée par l'opérateur ternaire se limite à une seule instruction.
    Si l'un de ces "résultats" implique plusieurs instructions, il faut utiliser l'écriture développée.
  • Le code doit rester lisible.
    Il vaut donc mieux ne pas multiplier à l'infini ces imbrications
    et bien réfléchir à la manière de l'optimiser... ;)

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

12 juil. 2006, 14:28

albat a écrit :Le code doit rester lisible.
Il vaut donc mieux ne pas multiplier à l'infini ces imbrications
et bien réfléchir à la manière de l'optimiser... ;)

J'ajoute que l'on peut bien entendu indenter les expressions à base d'opérateurs ternaires :

Code : Tout sélectionner

$resultat = $condition1
  ? ( $condition2 ? $resultat21 : $resultat22 )
  : ( $condition3 ? $resultat31 : $resultat32 );

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 13233 Messages

12 févr. 2013, 11:17

Ajout de précision sur le sucre syntaxique "?:"
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

4 messages   •   Page 1 sur 1