isset vs empty en PHP: diferencias y explicación

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:

is_numeric()

is_int()

is_string()

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 !=.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

2 comentarios en “isset vs empty en PHP: diferencias y explicación”

  1. Pingback: Sesiones en CodeIgniter - Parzibyte's blog

  2. Pingback: SQLite3 y PDO con PHP: crud y ejemplos - Parzibyte's blog

Dejar un comentario