Publicado por & archivado en PHP.

PHP parece cada día más un lenguaje de programación, abandonando sus inicios como procesador de formularios, y tal vez es ese inicio lo que hace que sea tan cómodo de usar, entre otras cosas, por la capacidad de sus variables para almacenar cadenas o números indistintamente y su capacidad de conversión directa entre ambos tipos, pero esto, puede llegar a producir algunos problemas.

A pesar de que tengo bien claro que una variable string y numérica son distintas, a pesar de que se que == hace comparaciones de variables de tipos distintos, a pesar de que suelo usar === y no mezclar tipos de variables, me he encontrado con un comportamiento inesperado de uno de mis programas por un despiste tonto.

Por error, utilicé “return 0” en vez de “return false” (algo que nunca hago cuando devuelvo strings), en un método para la detección de bots. Al usar este método en una página me encontré con un comportamiento indeseado (detectaba todas las IPs como bots), y fue por esto…


$var = 0;
if ($var == "google"){
    echo "Es igual";
}else{
    echo "Es distinto";
}

//Es igual

Aunque parezca increíble a simple vista, 0 es igual a “google” (o cualquier otra cadena de texto).

Esto es porque PHP convierte la cadena de la comparación a un número, antes de compararlo, y evidentemente cualquier cadena de texto será siempre igual a cero si la conviertes, aunque si le añadimos números delante de la cadena, los conservará (para mayor confusión), por ejemplo…


$var = 0;
if ($var == "7google"){
    echo "Es igual";
}else{
    echo "Es distinto";
}

//Es distinto

Si los números van detrás, entonces no los conserva…


$var = 0;
if ($var == "google7"){
    echo "Es igual";
}else{
    echo "Es distinto";
}

//Es igual

Vamos, que esto, si no lo sabes, es cuando menos confuso.

 

Está claro que en un método o función, no se deberían mezclar resultados numéricos con cadenas, como me pasó a mi al usar (por despiste), un “return 0” en vez de “return false”, por eso hay que tener siempre en cuenta que, aunque pueden ser parecidos, estos valores son realmente diferentes:


$var = 0;
$var = "";
$var = FALSE;

Si tenemos la sospecha de que una variable puede tener valores numéricos mezclados con cadenas y no queremos que haya errores, hay que usar en las comparaciones === en vez de == porque comprueba que las variables además de tener el mismo valor, son del mismo tipo (numérico o string).

Siguiendo el primer ejemplo, usando === obtenemos el resultado correcto…


$var = 0;
if ($var === "google"){
    echo "Es igual";
}else{
    echo "Es distinto";
}

//Es distinto

y también, para que quede claro…


$var = 0;
if ($var === "0"){
    echo "Es igual";
}else{
    echo "Es distinto";
}

//Es distinto

Es decir, 0 es distinto de “0”, porque el primero es un número y el segundo un string (un caracter que representa el número cero).

Se que esto no es nada nuevo, pero mucha gente no sabe que PHP hace las conversiones de tipo de esta forma tan absurda. Al buscar en stackoverflow he visto que hay quién incluso se ha escrito sus propias funciones para hacer comparaciones sin usar las de PHP. Realmente no se si la cosa es para tanto, pero desde luego si como para tenerlo bien presente al programar.

Deja un comentario

Tu dirección de correo electrónico no será publicada.