PHP 5.3 : Opérateur ?: revu
Par Pascal MARTIN le jeudi 13 novembre 2008, 07:30 - Développement Web - Lien permanent
Les exemples correspondant à ce point se trouvent dans le répertoire "ternary-operator".
PHP 5.3 modifie le comportement de l’opérateur conditionnel ternaire « ?: », en rendant optionnelle sa seconde opérande :
Sommaire :
Présentation
PHP propose depuis fort longtemps un opérateur ternaire, qui permet d’évaluer une condition, et renvoi une valeur si la condition est vraie, et l’autre si la condition était fausse :
condition ? valeur_si_vrai : valeur_si_faux
Hors, il nous arrive souvent d’utiliser cet opérateur pour utiliser une valeur si elle est vraie, et une autre dans le cas contraire, ce qui se traduit par du code de la forme suivante :
ma_valeur ? ma_valeur : autre_valeur
Dans ces situations, nous sommes forcés de dupliquer des écritures, parfois longues.
Pour nous faciliter les choses, PHP 5.3 modifie le comportement de l’opérateur ternaire, en ajoutant la possibilité de ne pas définir de valeur dans le cas où la condition est vraie ; c’est alors le résultat de l’évaluation de la condition qui sera retourné.
L’écriture utilisée juste au-dessus peut-alors être "résumée" de la manière suivante :
ma_valeur ?: autre_valeur
Note : vous êtes libre de placer des caractères d’espacement entre les symboles ‘?’ et ‘:’.
Exemples
Pour illustrer mes propos, voire montrer quelques usages de cette modification apportée à l’opérateur ternaire, voici quelques exemples :
A chaque fois, un encadré contiendra le code de l’exemple, et le suivant contiendra le résultat obtenu à l’affichage.
Exemple 1 : Est-ce que true est vrai ?
Il y a des chances :
var_dump(true ?: false);
bool(true)
Exemple 2 : Est-ce que false est vrai ?
Probablement pas ; c’est donc la seconde valeur (ici, true) qui sera retournée :
var_dump(false ?: true);
bool(true)
Exemple 3 : Et entre 1 et 0 ?
1 est une valeur vraie :
var_dump(1 ?: 0);
int(1)
Exemple 4 : Une chaine de caractères contenant du texte différent de "0" est évaluée à vrai - et donc, retournée :
var_dump('glop' ?: '');
string(4) "glop"
Exemple 5 : Même chose pour un tableau non-vide : il est évalué à vrai :
var_dump(array(10) ?: array());
array(1) {[0]=>int(10)}
Exemple 6 : Avec des appels de fonctions :
var_dump(strlen('glop') ?: strlen(''));
int(4)
Exemple 7 : Avec une variable non initialisée : isset renvoi faux, et c’est la seconde valeur qui est retournée par l’opérateur :
var_dump(isset($a) ?: 10);
int(10)
Exemple 8 : Et avec une variable initialisée ?
isset renvoi true :
$b = 'Hello, World!'; var_dump(isset($b) ?: 10); unset($b);
bool(true)
Exemple 9 : Et avec deux valeurs fausses toutes les deux ?
La première valeur est évaluée à faux. C’est donc la seconde, peu importe sa valeur, qui est retournée :
var_dump(isset($a) ?: '');
string(0) ""
Exemple 10 : Même chose avec une chaine de caractères vide : elle est évaluée à faux, et c’est la seconde valeur qui est retournée :
var_dump('' ?: isset($a));
bool(false)
En somme, pas une évolution révolutionnaire[1], mais toujours quelques caractères de moins à taper… Dans certains cas.
Un regret tout de même : que l’opérateur issetor n’ait pas lui aussi été intégré à PHP 5.3
D’autant plus qu’utiliser une syntaxe de la forme $a ?: 10 lèvera toujours une notice si $a n’existait pas.
Notes
[1] Même pas fait exprès !
Pour être averti lors de la publication de nouvelles entrées, n'hésitez pas à vous abonner au flux RSS ou ATOM des articles de mon blog !
Commentaires
Pourquoi ne pas avoir transposé ce qui se fait en ruby et en plus simple (opérateur || bien connu et compréhensible):
ma_valeur || autre_valeur
Peut-être pour éviter de "casser" les scripts déjà existants, pour lesquels l'opérateur
||retourne un booléen, et non la première valeur "vraie" ?(Et puis, si tous les langages utilisaient les mêmes opérateurs de la même façon, ça ne serait pas drôle :p )
je pense que l'utilisation
$ma_valeur ? $ma_valeur : $autre_valeurest moin souvent nécaisseraire que
isset($ma_valeur) ? $ma_valeur : $autre_valeurBonjour,
Je pose une question qui pourra peut-être vous paraître stupide, mais néanmoins je n'ai pas réussi à trouver une réponse claire ; voilà :
Avec l'opérateur conditionnel ternaire, est-il possible de donner 2 résultats pour true et 2 résultats pour false ?
Je m'explique : y a t'il un moyen de rendre valide ce genre de syntaxe :
(a>1) ? (b=5;c=5) : (b=0;c=0);
Merci !