Menu

Opérateurs de comparaison PHP : == ou === et <=>

PHP compare des valeurs avec == (égales après conversion de type), === (même valeur et même type), != et !==, < > <= >= et l'opérateur spaceship <=>. Quand == convertit les types, ce qui a changé en PHP 8, et toutes les comparaisons souples et strictes dans un seul tableau.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

== vérifie si deux valeurs sont égales après que PHP les a converties vers un type commun. === vérifie qu'elles sont égales et du même type. Donc 1 == "1" vaut true, alors que 1 === "1" vaut false.

La plupart des bugs de comparaison viennent de == qui convertit quelque chose d'inattendu. Un bon choix par défaut est === et !==, en passant à == seulement quand vous savez que vous voulez la conversion.

Tous les opérateurs de comparaison PHP

OpérateurNomVrai quand
$a == $bÉgalégaux après conversion de type
$a === $bIdentiqueégaux et du même type
$a != $b, $a <> $bDifférentdifférents après conversion de type
$a !== $bNon identiquedifférents, ou de types différents
$a < $b, $a > $bInférieur, supérieur
$a <= $b, $a >= $bInférieur ou égal, supérieur ou égal
$a <=> $bSpaceshiprenvoie -1, 0 ou 1

Tableau des comparaisons souples et strictes

Chaque case de ce tableau a été calculée par PHP 8.3. Basculez entre == et === et touchez une case pour voir l'expression. La grille == est pleine de surprises dans les lignes null, "", "0" et [] ; la grille === se réduit à sa diagonale.

Comparaison souple (==) et stricte (===)
Point at or tap a cell to read it as PHP.
$a == $btruefalse10-1"1""0"""null[]"php""10""1e1"
true
false
1
0
-1
"1"
"0"
""
null
[]
"php"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Comment == compare des types différents

Les règles que suit PHP 8, dans l'ordre où elles comptent en pratique :

  1. Deux chaînes numériques sont comparées comme des nombres : "10" == "1e1" et "1" == "01" valent tous deux true.
  2. Un nombre et une chaîne numérique : la chaîne devient un nombre. 100 == "1e2" vaut true.
  3. Un nombre et une chaîne non numérique : depuis PHP 8, le nombre devient une chaîne et ils sont comparés comme des chaînes. 0 == "a" vaut false (cela valait true en PHP 7).
  4. N'importe quoi et un bool : les deux côtés sont convertis en bool. "a" == true et [] == false valent true.
  5. null et une chaîne : null devient "", donc null == "" vaut true mais null == "0" vaut false. Face à tout autre type, null est comparé comme false.
  6. Deux tableaux : égaux quand ils ont les mêmes paires clé/valeur.

Cette dernière ligne montre pourquoi les comparaisons d'ordre avec null ont rarement du sens : null devient false, -1 devient true, et false < true.

Différent : != ou !==

!= et <> sont le même opérateur. !== en est la version stricte. La différence compte surtout avec les fonctions qui renvoient 0 ou false, comme strpos :

0 != false vaut false car 0 se convertit en false. 0 !== false vaut true car un int n'est pas un bool. Le même piège existe avec array_search et avec in_array sans son option stricte.

Comparer des chaînes

< et > comparent les chaînes octet par octet (par ordre alphabétique pour de l'ASCII simple). Si les deux chaînes sont numériques, elles sont comparées comme des nombres. Pour un ordre insensible à la casse ou « naturel », utilisez les fonctions :

L'opérateur spaceship <=>

$a <=> $b renvoie -1 quand $a est plus petit, 0 quand ils sont égaux et 1 quand $a est plus grand. Il suit les mêmes règles que < et ==, et c'est la façon la plus courte d'écrire une fonction de tri.

Comparer deux tableaux avec <=> les compare élément par élément, et c'est ainsi que la fonction trie d'abord par âge puis par nom. D'autres recettes de tri sont sur la page sur le tri des tableaux.

Erreur fréquente : comparer des floats avec ==

Les floats sont stockés en binaire, donc beaucoup de valeurs décimales sont des approximations. 0.1 + 0.2 ne vaut pas exactement 0.3, et == voit la différence.

Pour de l'argent, stockez des centimes entiers et comparez-les avec ===.

Questions fréquentes

Quelle est la différence entre == et === en PHP ?

== convertit les deux côtés vers un type commun puis compare, donc 1 == "1" vaut true. === n'est vrai que si les valeurs sont égales et du même type, donc 1 === "1" vaut false. Utilisez === sauf si vous voulez la conversion.

0 == "a" est-il vrai en PHP ?

Plus depuis PHP 8. Quand un nombre est comparé à une chaîne non numérique, PHP 8 les compare comme des chaînes, donc 0 == "a" vaut false. En PHP 7, la chaîne était convertie en 0 et le résultat valait true.

Quelle est la différence entre != et !== en PHP ?

!= (et son alias <>) est l'inverse de == : il est faux quand les valeurs sont égales après conversion de type. !== est l'inverse de === : il est vrai quand les valeurs ou leurs types diffèrent, donc 0 !== false vaut true alors que 0 != false vaut false.

Comment comparer deux floats en PHP ?

N'utilisez pas == sur des résultats de calculs en float : 0.1 + 0.2 == 0.3 vaut false. Comparez plutôt la différence à une petite tolérance : abs($a - $b) < PHP_FLOAT_EPSILON, ou arrondissez les deux à la précision qui vous intéresse.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER