web

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

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.