== comprueba si dos valores son iguales después de que PHP los convierta a un tipo común. === comprueba que sean iguales y del mismo tipo. Así, 1 == "1" es true, mientras que 1 === "1" es false.
La mayoría de los bugs con comparaciones vienen de que == convierte algo que no esperabas. Un buen hábito por defecto es === y !==, y pasar a == solo cuando sabes que quieres la conversión.
Todos los operadores de comparación de PHP
| Operador | Nombre | Verdadero cuando |
|---|---|---|
$a == $b | Igual | son iguales tras la conversión de tipos |
$a === $b | Idéntico | son iguales y del mismo tipo |
$a != $b, $a <> $b | Distinto | no son iguales tras la conversión de tipos |
$a !== $b | No idéntico | no son iguales, o tienen tipos distintos |
$a < $b, $a > $b | Menor que, mayor que | |
$a <= $b, $a >= $b | Menor o igual, mayor o igual | |
$a <=> $b | Nave espacial | devuelve -1, 0 o 1 |
Tabla de comparación flexible y estricta
Cada celda de esta tabla la calculó PHP 8.3. Cambia entre == y === y toca una celda para ver la expresión. La cuadrícula de == está llena de sorpresas en las filas de null, "", "0" y []; la de === es solo su diagonal.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
Cómo compara == tipos distintos
Las reglas que sigue PHP 8, en el orden en que importan en la práctica:
- Dos cadenas numéricas se comparan como números:
"10" == "1e1"y"1" == "01"sontrue. - Un número y una cadena numérica: la cadena se convierte en número.
100 == "1e2"estrue. - Un número y una cadena no numérica: desde PHP 8, el número se convierte en cadena y se comparan como cadenas.
0 == "a"esfalse(eratrueen PHP 7). - Cualquier cosa y un bool: los dos lados se convierten a bool.
"a" == truey[] == falsesontrue. - null y una cadena:
nullse convierte en"", así quenull == ""estrueperonull == "0"esfalse. Frente a cualquier otro tipo,nullse compara comofalse. - Dos arrays: son iguales cuando tienen los mismos pares clave/valor.
Esa última línea muestra por qué las comparaciones de orden con null rara vez tienen sentido: null se convierte en false, -1 en true, y false < true.
Distinto: != vs !==
!= y <> son el mismo operador. !== es la versión estricta. La diferencia importa sobre todo con funciones que devuelven 0 o false, como strpos:
0 != false es false porque 0 se convierte en false. 0 !== false es true porque un int no es un bool. La misma trampa se aplica a array_search y a in_array sin su opción estricta.
Comparar cadenas
< y > comparan cadenas byte a byte (en orden alfabético para ASCII simple). Si las dos cadenas son numéricas, se comparan como números. Para un orden sin distinguir mayúsculas o un orden "natural", usa las funciones:
El operador nave espacial <=>
$a <=> $b devuelve -1 cuando $a es menor, 0 cuando son iguales y 1 cuando $a es mayor. Usa las mismas reglas que < y ==, y es la forma más corta de escribir un callback de ordenación.
Comparar dos arrays con <=> los compara elemento a elemento, y así es como el callback ordena primero por edad y después por nombre. Hay más recetas de ordenación en la página de ordenar arrays.
Error frecuente: comparar floats con ==
Los floats se guardan en binario, así que muchos valores decimales son aproximaciones. 0.1 + 0.2 no es exactamente 0.3, y == ve la diferencia.
Para dinero, guarda céntimos enteros como integers y compáralos con ===.
Preguntas frecuentes
¿Cuál es la diferencia entre == y === en PHP?
== convierte los dos lados a un tipo común y luego compara, así que 1 == "1" es true. === solo es verdadero cuando los valores son iguales y del mismo tipo, así que 1 === "1" es false. Usa === salvo que quieras la conversión.
¿Es 0 == "a" true en PHP?
No desde PHP 8. Cuando se compara un número con una cadena no numérica, PHP 8 los compara como cadenas, así que 0 == "a" es false. En PHP 7 la cadena se convertía en 0 y el resultado era true.
¿Cuál es la diferencia entre != y !== en PHP?
!= (y su alias <>) es lo contrario de ==: es falso cuando los valores son iguales tras la conversión de tipos. !== es lo contrario de ===: es verdadero cuando los valores o sus tipos son distintos, así que 0 !== false es true mientras que 0 != false es false.
¿Cómo comparo dos floats en PHP?
No uses == con resultados de aritmética de floats: 0.1 + 0.2 == 0.3 es false. Compara en su lugar la diferencia con una tolerancia pequeña: abs($a - $b) < PHP_FLOAT_EPSILON, o redondea los dos a la precisión que te interese.