Menu

Operadores de comparación en PHP: == vs === y <=>

PHP compara valores con == (igual tras la conversión de tipos), === (mismo valor y mismo tipo), != y !==, < > <= >= y el operador nave espacial <=>. Aprende cuándo == convierte tipos, qué cambió en PHP 8 y mira todas las comparaciones flexibles y estrictas en una tabla.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

== 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

OperadorNombreVerdadero cuando
$a == $bIgualson iguales tras la conversión de tipos
$a === $bIdénticoson iguales y del mismo tipo
$a != $b, $a <> $bDistintono son iguales tras la conversión de tipos
$a !== $bNo idénticono son iguales, o tienen tipos distintos
$a < $b, $a > $bMenor que, mayor que
$a <= $b, $a >= $bMenor o igual, mayor o igual
$a <=> $bNave espacialdevuelve -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.

Comparación flexible (==) y estricta (===)
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.

Cómo compara == tipos distintos

Las reglas que sigue PHP 8, en el orden en que importan en la práctica:

  1. Dos cadenas numéricas se comparan como números: "10" == "1e1" y "1" == "01" son true.
  2. Un número y una cadena numérica: la cadena se convierte en número. 100 == "1e2" es true.
  3. 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" es false (era true en PHP 7).
  4. Cualquier cosa y un bool: los dos lados se convierten a bool. "a" == true y [] == false son true.
  5. null y una cadena: null se convierte en "", así que null == "" es true pero null == "0" es false. Frente a cualquier otro tipo, null se compara como false.
  6. 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.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR