¿En qué se diferencian los operadores de comparación PHP de igualdad (== doble igual) e identidad (=== triple igual)?
¿ Cuál es la diferencia entre ==
y ===
?
- ¿Cómo funciona exactamente la
==
comparación vaga? - ¿Cómo funciona exactamente la
===
comparación estricta?
¿Cuáles serían algunos ejemplos útiles?
diferencia entre ==
y===
La diferencia entre el ==
operador vagamente igual y el ===
operador estrictamente idéntico se explica exactamente en el manual :
Operadores de comparación
Ejemplo | Nombre | Resultado |
---|---|---|
$a == $b | Igual | VERDADERO si $a es igual a $b después del malabarismo de tipos. |
$a === $b | Idéntico | VERDADERO si $a es igual a $b y son del mismo tipo. |
==
Comparación ligeramente igual
Si está utilizando el ==
operador, o cualquier otro operador de comparación que utilice una comparación vaga como !=
, <>
o ==
, siempre debe mirar el contexto para ver qué, dónde y por qué se convierte algo para comprender qué está sucediendo.
Reglas de conversión
- Convirtiendo a booleano
- Convertir a entero
- Convirtiendo a flotante
- Convirtiendo a cadena
- Convirtiendo a matriz
- Convertir a objeto
- Convirtiendo a recurso
- Convirtiendo a NULO
Tabla de comparación de tipos
Como referencia y ejemplo puedes ver la tabla comparativa en el manual :
VERDADERO | FALSO | 1 | 0 | -1 | "1" | "0" | "-1" | NULO | formación() | "php" | "" | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
VERDADERO | VERDADERO | FALSO | VERDADERO | FALSO | VERDADERO | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO |
FALSO | FALSO | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | VERDADERO | VERDADERO | FALSO | VERDADERO |
1 | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
0 | FALSO | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | VERDADERO | FALSO | VERDADERO | VERDADERO |
-1 | VERDADERO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO |
"1" | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
"0" | FALSO | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO |
"-1" | VERDADERO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO |
NULO | FALSO | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | VERDADERO | VERDADERO | FALSO | VERDADERO |
formación() | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | VERDADERO | FALSO | FALSO |
"php" | VERDADERO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO |
"" | FALSO | VERDADERO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | VERDADERO |
===
Comparación idéntica estricta
Si está utilizando el ===
operador, o cualquier otro operador de comparación que utilice una comparación estricta como !==
o ===
, siempre puede estar seguro de que los tipos no cambiarán mágicamente , porque no se realizará ninguna conversión. Entonces, con una comparación estricta, el tipo y el valor deben ser los mismos, no solo el valor.
Tabla de comparación de tipos
Como referencia y ejemplo puedes ver la tabla comparativa en el manual :
Comparaciones estrictas con===
VERDADERO | FALSO | 1 | 0 | -1 | "1" | "0" | "-1" | NULO | formación() | "php" | "" | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
VERDADERO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
1 | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
0 | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
-1 | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
"1" | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO |
"0" | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO | FALSO |
"-1" | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO | FALSO |
NULO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO | FALSO |
formación() | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO | FALSO |
"php" | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO | FALSO |
"" | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | FALSO | VERDADERO |
Nota del editor : esto se citó correctamente anteriormente, pero es más legible como una tabla de rebajas. Esto no es plagio
El operador == convierte entre dos tipos diferentes si son diferentes, mientras que el operador === realiza una 'comparación segura de tipos'. Eso significa que sólo devolverá verdadero si ambos operandos tienen el mismo tipo y el mismo valor.
Ejemplos:
1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value
Advertencia : dos instancias de la misma clase con miembros equivalentes NO coinciden con el ===
operador. Ejemplo:
$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)