Comparación flexible y estricta en PHP

PHP es un lenguaje débilmente tipificado o no tipado, como prefieras llamarlo. Esto significa que no hay que declarar el tipo de las variables. Si no tienes bien asimilados los fundamentos de PHP se te pueden plantear un montón de situaciones confusas relacionadas con este tema. Pero no te preocupes, ¡en el post de hoy despejamos las dudas!

En el post de hoy despejamos las dudas

¿Cuál es el problema?

A diferencia de los lenguajes fuertemente tipados, los no tipados permiten combinar datos de diferente tipo, comparar cadenas de caracteres con números enteros o booleanos, por ejemplo, o sumar y restar datos de tipos distintos.

Lo anterior es una característica de tal o cual lenguaje de programación. ¿Sabías que JavaScript también es un lenguaje débilmente tipificado? Eso no quiere decir que PHP o JavaScript son mejores ni peores que otros, tampoco son “guarros” como dicen algunos en foros de discusión y redes sociales. 😀

Mira este código:

En vez de lanzar un error, como haría un lenguaje fuertemente tipado, PHP calcula esta expresión e imprime la frase:

El resultado es 100 porque PHP convierte implícitamente la cadena '55' a su valor numérico correspondiente 55.

Así que ya lo ves. Los lenguajes no tipados realizan conversiones de tipo implícitas al evaluar expresiones que combinan tipos de datos diferentes. Por así decirlo, hacen lo que pueden, lo más lógico con tal de conseguir su objetivo: evaluar la expresión. El problema es que esta conversión queda fuera del control del programador.

Evaluar la expresión

Algunos ejemplos de comparaciones flexibles

Ok, veamos unos ejemplos. Las comparaciones flexibles son las que se hacen con el operador igual (==) y el operador diferente (!=), ¿vale? Mira, echa un vistazo a estas comparaciones:

Las dos se evalúan a true y el programa imprime esto:

Allá va otro ejemplo:

¡Pero cuidado!, este script imprime:

¿Sabes por qué? Porque PHP primero convierte la cadena 'password' a 0 para poder hacer la comparación flexible ==. Esto es muy importante. Recuérdalo para siempre, cuando PHP compara una cadena de caracteres con un número entero intenta convertir la cadena a un valor numérico. Pero si no puede hacerlo, como sucede en este caso, entonces PHP la convierte a 0.

¡Hola operadores de comparación estricta!

Los operadores de comparación estricta idéntico (===) y no idéntico (!==) vienen al rescate para solucionar el cacao de la conversión implícita de tipos de PHP. Son como los flexibles solo que además comprueban el tipo de los valores que comparan.

¡Hola operadores de comparación estricta!

Se recomienda utilizarlos para eliminar ambigüedades y bugs que pueden salir como consecuencia de la falta de control sobre la conversión de tipos implícita de PHP. ¿A qué esperas?, ¡pásate ya a las comparaciones estrictas de PHP! Tu código será más seguro.

Adjunto a continuación esta tabla que he tomado del manual de PHP para que veas la diferencia entre las comparaciones flexibles y las estrictas.

Ejemplo Nombre Resultado
$a == $b Igual TRUE si $a es igual a $b después de la manipulación de tipos.
$a === $b Idéntico TRUE si $a es igual a $b, y son del mismo tipo.
$a != $b Diferente TRUE si $a no es igual a $b después de la manipulación de tipos.
$a !== $b No idéntico TRUE si $a no es igual a $b, o si no son del mismo tipo.

Tomemos ahora los ejemplos de arriba y sustituyamos el operador igual por el operador idéntico:

Este programa no imprime nada porque las dos condiciones contienen valores de tipos distintos. Las dos se evalúan a false. Ciertamente, $a es una cadena y false es un valor booleano, por otro lado $b también es una cadena y true es un valor booleano.

¿Y qué hay del ejemplo del password?

Ahora el programa genera esta salida:

¡Claro!, porque $input es un entero y $password es una cadena. Las dos variables son de tipo distinto y la condición se evalúa a false.

Esto es todo por hoy. Gracias por haber leído este post. Espero que te ayude a entender por qué es mejor utilizar los operadores idéntico === y no idéntico !== en lugar de igual == y diferente !=. ¿Lo compartes con tus amigos y amigas?