PHP == vs ===: diferencia clave y por qué es importante

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: La trampa que todos los novatos sufren

\n\n

Imagina esta situación: estás escribiendo tu primer script en PHP, verificas si el usuario ingresó la contraseña correcta y usas la condición if ($password == "secret"). Todo funciona perfectamente. Pero un mes después notas un comportamiento extraño: if (0 == "off") devuelve true, aunque son dos cosas completamente diferentes. ¿Te suena familiar?

\n\n

Bienvenido al mundo de los operadores de comparación en PHP. Aquí, el doble igual (==) y el triple igual (===) no son solo símbolos distintos, sino dos enfoques completamente diferentes para comparar. Si no entiendes la diferencia, tu código puede comportarse de manera impredecible y los errores se esconderán donde menos los esperas.

\n\n

En este artículo analizaremos:

\n
    \n
  • Cómo funciona cada operador "por dentro"
  • \n
  • Por qué "123abc" == 123 es true, pero "123abc" === 123 es false
  • \n
  • Qué trampas te esperan (spoiler: muchas)
  • \n
  • Cuándo usar cada operador en proyectos reales
  • \n
\n\n

¿Listo? ¡Vamos allá!

\n\n

1. Conceptos básicos: ¿Qué son == y === en PHP?

\n\n

Ambos operadores se usan para comparar dos valores. Pero su enfoque es fundamentalmente diferente.

\n\n

Operador de igualdad (==) — "se permite la conversión de tipos"

\n

El doble igual (o comparación no estricta) primero convierte ambos operandos al mismo tipo y luego compara sus valores. Si los tipos son diferentes, PHP los transforma automáticamente a un denominador común. Es práctico, pero peligroso.

\n\n

Operador de identidad (===) — "todo debe coincidir"

\n

El triple igual (o comparación estricta) compara tanto los valores como los tipos de datos. Si los tipos son diferentes, devuelve false de inmediato, sin ninguna conversión.

\n\n

Aquí tienes una tabla simple para recordarlo:

\n
    \n
  • $a == $b — ¿Son iguales los valores después de convertir los tipos?
  • \n
  • $a === $b — ¿Son iguales los valores y coinciden los tipos?
  • \n
\n\n

2. Ejemplo simple: números y cadenas

\n\n

Veamos el caso clásico: comparar un número y una cadena.

\n\n
<?php\n$a = 5;      // integer\n$b = "5";   // string\n\n// Comparación no estricta (==)\nvar_dump($a == $b);  // bool(true) — PHP convierte la cadena "5" al número 5\n\n// Comparación estricta (===)\nvar_dump($a === $b); // bool(false) — los tipos son diferentes: integer vs string\n?>
\n\n

En el primer caso, PHP piensa: "Vale, un número y una cadena. La cadena '5' se convierte fácilmente al número 5, así que son iguales". En el segundo caso: "No, integer no es string, directamente false".

\n\n

Parece un detalle menor, pero aquí es donde empiezan los problemas.

\n\n

3. La trampa principal: "Vacío" y "cero"

\n\n

El error más común entre principiantes es la confusión con los valores falsy. En PHP hay varios valores que, en una comparación no estricta, se consideran iguales entre sí, aunque su significado sea completamente diferente.

\n\n

Mira este código:

\n\n
<?php\nvar_dump(0 == false);  // bool(true)  — cero es igual a false\nvar_dump(0 == null);   // bool(true)  — cero es igual a null\nvar_dump(false == null); // bool(true)  — false es igual a null\nvar_dump("" == false); // bool(true)  — cadena vacía es igual a false\nvar_dump("" == 0);     // bool(true)  — cadena vacía es igual a cero\n?>
\n\n

¿Impactante? ¡Y tanto! 0 == false es true, "" == 0 también es true. Si estás verificando si el usuario ingresó una contraseña y escribes if ($password == ""), y luego comparas con if ($password == 0), ambas condiciones pueden activarse de la misma manera, aunque sean escenarios diferentes.

\n\n

Ahora compara con el triple igual:

\n\n
<?php\nvar_dump(0 === false);  // bool(false)\nvar_dump(0 === null);   // bool(false)\nvar_dump("" === false); // bool(false)\nvar_dump("" === 0);     // bool(false)\n?>

Blogs

Book Recommendations