Si programas en php casi seguro que más de 1 y posiblemente 1000 veces has acabado en la documentación mirando lo mismo. Esta vez te voy a explicar la diferencia entre 0, false, null y «» (string vacío) en php.
Precisamente la culpa de este artículo la tiene un compañero de trabajo, así que podemos darle las gracias. A pesar de programar durante años, y tener conocimientos avanzados muchas veces acabo mirando en la documentación de php cosas tan simples como analizar variables vacías.
Qué diferencia hay entre false, null, “string vacío” y 0 en php
Intentaré explicarlo todo de la forma más sencilla posible, y con los ejemplos más claros. De todas formas si queda alguna duda en alguna de las secciones, o crees que algo debería ser revisado puedes dejar un comentario y lo miramos.
Cuando programas en php, un campo vacío o sin valor se puede presentar de diferentes formas:
- NULL
- FALSE
- 0
- «»
Aquí es cuando llegan las dudas, pues a simple vista parecen 4 valores completamente diferentes o que se puedan interpretar de diversas formas. Pero esto no es del todo cierto.
Null, false, o y «» son básicamente lo mismo
Esta es la primera sorpresa que te puedes llevar al tratar de comparar estas cadenas. A veces hay que hacer comparar con if, isset, o de otras formas variadas un valor con otro, y los resultados son bastante obvios.
Supongamos por ejemplo que tenemos un archivo php con la siguiente estructura (puedes copiarlo y probarlo si quieres, pero te pondré también el resultado):
<?php if(null == false){ echo('ok'); } if(null == 0){ echo('ok'); } if(null == ""){ echo('ok'); } if(null == "0"){ echo('ok'); } if(null == array()){ echo('ok'); } if(false == ""){ echo('ok'); } if(false == 0){ echo('ok'); } if("" == 0){ echo('ok'); } if(array() == 0){ echo('ok'); }
¿Cuales crees que serán los resultados así a ojo?, para tu sorpresa te va a devolver lo siguiente:
ok ok ok ok ok ok ok ok ok
Lo que significa que en todos los supuestos la comparación obtenida será positiva. Pero ojo, pues lo que significan los dos símbolos de igual (==) es que los valores sean iguales o valgan lo mismo (en este caso nada), mientras que si usas 3 (===) deben ser idénticos y no coincidiría en ninguno de los casos.
A tener en cuenta que cuando comparamos 0 como un string («0»), también se considera un valor nulo y lo mismo pasará con un array() vacío.
Con estas pruebas a la espalda, puedes encontrar cierta utilidad bastante interesante si estás acostumbrado a estar comparando valores contínuamente dentro de expresiones if.
Si le das un valor a una variable, ya bien sea a mano, o provenga de la base de datos, la puedes comprobar sin tener que revisar la igualdad para cualquiera de estos tipos de valores. Algo así:
<?php $valor = 0; if($valor){ echo("vale algo"); }else{ echo("no vale nada"); }
Te devolverá no vale nada, y lo mismo pasará si la variable tiene valor null, false o «». Es decir, que si en tu tabla de la base de datos tienes una columna que puede tener valor 0 o un número mayor, un null, o está vacía, puedes comprobarla sin compararla.
Cuando usar isset, is_null o empty
Ahora entonces llega la duda, para qué sirven entonces las funciones de php:
- isset()
- is_null()
- empty()
Cada una de ellas te ayudará a realizar comprobaciones más concretas sobre la variable en cuestión:
isset()
No se fija en el valor, sino en si está definida una variable. Esto significa que basta con que la variable exista antes de la comprobación para que devuelva true. (por ejemplo $var=0, $var=»» o $var=null).
<?php $valor = null; if(isset($valor)){ echo("está definido"); }else{ echo("no está definido"); }
Como resultado en este caso indicará está definido, ya que como comentaba la variable existe aunque su valor sea null.
is_null()
En este caso y como su nombre indica comprueba si una variable está definida como null. Esta puede venir de la base de datos también y devolverá true.
<?php $valor = null; if(is_null($valor)){ echo("true history!"); } $valor = false; if(is_null($valor)){ echo("true history!"); }
La primera coincidirá y devolverá true history! mientras que la segunda va a devolver false y no se mostrará el contenido del if.
empty()
Por último empty analiza si una variable además de existir tiene algún valor. Esto significa que mientras el contenido de la variable sea equivalente a null (como hemos visto antes), no devolverá true.
Es decir, empty($valor) devuelve true si:
- $valor = «»
- $valor = null
- $valor = false
- $valor = 0 (0.0 o «0»)
Cualquier comentario es bien recibido así que si te quedan dudas o me he dejado algo…
¿Cómo usabas las comparaciones entre estas variables? Comenta y comparte