En PHP, si il est possible de faire des return de function() dans des affectations de variables, pourquoi ne pas les affecter directement de manière conditionnelle?
Bon, je vous l’accorde, l’intro c’était pour me faire plaisir et opérateur ternaire ou affectation conditionnelle; c’est la même chose. Ok.
Mais reprenons depuis le début; juste pour le plaisir de bien comprendre:
Quand on étudie des bouts de code PHP ici où là, on voit souvent des variables qui sont égales à quelque chose d’étrange. Imaginons ceci :
$str = 'Lorem ipsum dolor sit amet'; $my_var = ($str) ? true : false; var_dump($my_var);
Ce qui nous donnera le résultat suivant :
bool(true)
Ce qu’il faut comprendre ici est assez simple dans la première approche.
Si ce qui est entre parenthèse est vrai
Alors ce qui est AVANT les : sera la valeur de la variable
Sinon ce qui est APRES les : sera la valeur de la variable
Vous l’avez déjà compris, on retrouve notre brave if else. Nous pouvons donc y ajouter les conditions que l’on souhaite; par exemple:
$my_var= ( !is_null($str) ) ? true : false;
Ici notre variable $str étant égale à quelque chose, elle n’est pas null. Ce qui est entre les parenthèses est donc vrai.
Donc $my_var sera égale à true.
Un petit détail de plus
En PHP, on peut imbriquer les conditions dans des conditions.
Notre amis l’affectation conditionnelle ou opérateur ternaire peut aussi le faire.
Dans ce genre de cas l’indentation est importante sinon on se retrouve avec des lignes particulièrement longue et indigeste. Considérons l’exemple suivant:
$str = 'Lorem ipsum dolor sit amet'; $nbr = (int)4; $resultat = ( !is_null($str) ) ? ( !empty($str) ) ? true : false ) : ( $nbr <= 110 ? true : false );
Evidemment on peut pousser les imbrications plus loin; mais je pense que vous avez compris le principe.
Grattons le fond du problème
Comment être sur que notre condition va bien renvoyer true ou false?
Pour cela, il faut bien comprendre comment PHP interprète ce qu’on lui donne. PHP est un langage de programmation ayant un typage faible.
Cela veut dire que l’on peut donner n’importe quoi, ou rien, à une variable à n’importe quel moment. A partir de là, PHP va faire son job, déterminer ce qu’il peut avec ce qu’il a. Et il ne fera que quand on lui demande.
Voici deux exemples :
$my_string = ""; var_dump(is_null($my_string)); // false var_dump(isset($my_string)); // true var_dump(empty($my_string)); // true
$my_string = "lol"; var_dump(is_null($my_string)); // false var_dump(isset($my_string)); // true var_dump(empty($my_string)); // false
Dans le premier cas, le test de isset revoit true, alors que la string est vide. Mais c est une string; est elle est définie par $my_string = « »;
Dès lors le test est vrai alors qu’intuitivement on pourrait se dire que non.
Soyez prudent et prenez le temps de savoir ce qui est vrai ou non (ou null) en php.
Pour finir
Cet outil est assez pratique et permet de réduire notablement le nombre de lignes de votre code. Attention toutefois au retour de condition qui sont parfois contre intuitif.
Pour moi, la seul façon de se protéger de cela reste la rigueur et de définir explicitement le type de variable qu’on expose dans la condition.