PHP 5.3 : Opérateur ?: revu

13 novembre 2008php, php-5.3
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

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 !