PHP 5.3 : Opérateur ?: revu
13 novembre 2008 —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.
Note
[1] Même pas fait exprès !