Introducción
Veremos y compararemos a isset vs empty en PHP. Como sabemos, estas dos funciones existen en PHP y permiten comparar valores nulos o vacíos.
isset vs empty en PHP
isset
A isset no le importa el valor de la variable que estamos probando, sólo le importa que no sea nulo. Esto viene bien cuando no nos importa el tipo de valor que tiene la variable, y sólo necesitamos saber si existe.
Más bien dicho, sólo testea o prueba si existe una variable. Supongo que de ahí su nombre de “is set”.
Devuelve true si la variable existe, false en caso contrario.
Ejemplos:
$var1 = null; isset($var1); # false, porque está en null isset($var2); # false, ni siquiera la hemos declarado $arreglo = [ "nombre" => "María", ]; isset($arreglo); # true, claro que está definido isset($arreglo["nombre"]); # true, pues sí existe el nombre isset($arreglo["edad"]); #false, arreglo existe pero la clave edad no # Lo de abajo da falso, ya que para empezar # no existe la clave deportes, entonces no puedes leer la propiedad # null de null isset($arreglo["deportes"]["preferidos"]);
empty
empty es un poco mejor pero también peligrosa. A esta sí le importa el valor de la variable, pero tiene sus preferencias en cuanto a decidir si está vacía o no.
La usamos para probar si un arreglo está vacío ([]), una cadena está vacía (“”), un número es 0, entre otros. Citando la documentación oficial…
Las siguientes expresiones son consideradas como vacías:
- “” (una cadena vacía)
- 0 (0 como un integer)
- 0.0 (0 como un float)
- “0” (0 como un string)
- NULL
- FALSE
- array() (un array vacío)
- $var; (una variable declarada, pero sin un valor)
Esta función viene bien cuando queremos, por ejemplo, saber si una cadena está definida y aparte de ello no está vacía. Normalmente podríamos hacer esto (puede variar, por ejemplo podemos usar is_string, strcmp, strlen, mb_strlen pero es un ejemplo):
if(isset($_POST["nombre"]) && $_POST["nombre"] !== ""){ echo "OK"; }
Ya que si sólo comparamos con:
if($_POST["nombre"] !== ""){ echo "OK"; }
Y algún gracioso no manda el campo de “nombre” (por lo que está definido), saldrá este maravilloso error:
PHP Notice: Undefined index: nombre
Pero con empty nos ahorramos ese código, y queda más bonito sin errores. Así:
if(!empty($_POST["nombre"])){ echo "OK"; }
Es más silencioso y limpio. Así probará si la variable está definida y no está vacía.
Lo peligroso de empty
Lo peligroso de esta función es que puede devolver falso cuando realmente algo no está vacío.
Por ejemplo, si estamos recibiendo un número entero que representa los puntos que tiene un usuario (puede ser 0), empty devolverá false incluso si el valor está definido; ya que, como vimos arriba, 0 pasa como false. Y también la cadena “0”
¿Entonces cuál usar?
Depende, como siempre. Ya comparamos isset vs empty en PHP pero depende de nosotros y nuestras costumbres.
La función empty no genera errores si la clave no existe, pero a veces devuelve falsos cuando no lo son.
E isset genera errores, no ve cadenas vacías o números en 0, pero sólo verifica si no es null.
Recomendación
Ya que PHP es un lenguaje en donde los tipos no están bien definidos (excepto por PHP 7 en donde tenemos una pequeña mejora) recomiendo probar con las siguientes funciones:
Y si probamos enteros, también probar con > y < y los operadores de comparación. Con cadenas recomiendo usar strcmp o strlen, o incluso mejor: mb_strlen.
Antes de usar estas funciones, podemos usar isset para no tener errores de valores indefinidas o índices no existentes. O al menos esa es mi recomendación.
Finalmente, no olvidemos utilizar el valor de identidad === en lugar de ==. O !== en lugar de !=.
Pingback: Sesiones en CodeIgniter - Parzibyte's blog
Pingback: SQLite3 y PDO con PHP: crud y ejemplos - Parzibyte's blog