5- Les opérateurs logiques et de comparaison

Les opérateurs logiques et de comparaison permettent d’effectuer des comparaisons entre les variables (ou les données). Tandis que les opérateurs de comparaisons se positionnent entre deux variables, les opérateurs logiques se situent entre deux comparaisons. Les comparaisons renvoient toujours un booléen (true ou false) selon que la comparaison sera vraie ou fausse. Dans tous les cas où une comparaison n’est pas vraie, elle est fausse.

Les opérateurs de comparaison

Les opérateurs de comparaison peuvent être arithmétiques, comparer le type d’une variable ou les deux

Les opérateurs arithmétiques et de type sont les suivants

  • $a > $b : supérieur (vrai si a plus grand que b)
  • $a < $b : inférieur (vrai si a inférieur à b.
  • $a == $b : égal (vrai si la valeur de a est égale à la valeur de b)
  • $a >= $b : supérieur ou égal (vrai si la valeur de a est supérieure ou égale à la valeur de b)
  • $a <= $b : inférieur ou égal (vrai si la valeur de a est inférieure ou égale à la valeur de b)
  • $a === $b : identique (vrai si la valeur et le type de a et b sont égaux)
  • $a != $b OU $a <> $b : différent (vrai si a différent de b après transtypage)
  • $a !== $b : différent (vrai si a et b n’ont pas le même type ou la même valeur)
  • $a instanceof MaClasse : instance de (vrai si $a est une instance de MaClasse)

Exemples de comparaisons :

var_dump(
   5 > 3,           // bool(true)
   5 == 5,          // bool(true)
   5 < 3,           // bool(false)
   5 <= 3,          // bool(false)
   5 !== 3);        // bool(true)

Un dernier opérateur existe depuis php 7.0 et il est le seul à ne pas renvoyer un booléen :

$a <=> $b : combiné (renvoie un entier inférieur, égal ou supérieur à zéro si a inférieur, égal ou supérieur à b).

L’exemple suivant renvoie donc 1

$a = 5;
$b = 3;
return $a <=> $b;

Les structures ternaires :

Les structures ternaires permettent à la fois d’évaluer une condition et d’affecter une variable. Elles se décomposent de la manière suivante : variable à affecter = condition ? valeur si vrai : valeur si faux.

Exemple :

$a = 5;
$b = 3;
$a = $a < $b ? 10 : 12;

Depuis PHP 5.3, il existe une version raccourcie qui permet d’omettre la partie centrale : variable à affecter = condition ?: valeur. La variable vaudra la valeur si la condition est fausse, sinon elle gardera sa valeur de départ.

Exemple :

$a = 5;
$b = 3;
$a = $a < $b ?: 12;

Depuis PHP7.0 il existe un autre opérateur : l’opérateur de fusion nulle qui teste si la valeur d’une variable en condition est nulle, et qui lui affecte sa valeur le cas échéant. Si la valeur est nulle, elle prend la valeur de la seconde partie. La syntaxe est la suivante : variable à affecter = variable ?? valeur si nulle.

Exemple :

$a = 5;
$b = null;
$a = $b ?? 12; // a vaut donc 12
$a = $a ?? 14; // a vaut toujours 12

Les opérateurs Logiques

Les opérateurs logiques nous permettent d'enchaîner la vérification de plusieurs variables (booléennes), fonctions (dont le type de retour est booléen) ou conditions (ce qui est la même chose puisqu’une condition renvoie un booléen).

Liste des opérateurs logiques

  • $a and $b OU $a && $b : vrai si a ET b valent true.
  • $a or $b OU $a || $b : vrai si a OU b vaut true.
  • $a xor $b : vrai si a OU b vaut true mais pas les deux en même temps
  • !$a : vrai si a n’est pas vrai

Exemple :

function toto(int $nb) : int{
   return $nb;
}

$a = 5;
$b = 3;
$ret =  $a == 5 || $a <= $b && toto($a) instanceof MaClasse;
var_dump($ret); // retourne true

Lorsque l’on enchaîne plusieurs comparaison, il suffit d’arriver à un point où le langage connaît la réponse pour ne même pas exécuter les conditions suivantes. Dans l’exemple précédent, PHP a su dès la première partie de la condition (a==5) que la condition est vraie puisqu’elle est suivie d’un || et que des parenthèses ne viennent pas perturber le sens de lecture des opérateurs logiques (de gauche vers la droite). Ici, même si la fonction toto ne retourne pas une instance de MaClasse, la condition est vraie puisque PHP considère que la deuxième partie de la condition (après le ||) est une seule condition.

Ici, les parenthèses n’ont ici aucune utilité :

$a = 5;
$b = 3;
return $a == 5 || ($a <= $b && toto($a) instanceof MaClasse); // retourne true 

Pour évaluer les deux premières parties de la condition, puis la troisième, il faut ajouter les mettre entre parenthèses.

Ici, les parenthèses sont utiles :

function toto(int $nb) : int{
   return $nb;
}

$a = 5;
$b = 3;
$ret =  ($a == 5 || $a <= $b) && toto($a) instanceof MaClasse;
var_dump($ret); // retourne false

Pour plus d’informations sur la priorité de chaque opérateur : http://php.net/manual/fr/language.operators.precedence.php