Cuál es la diferencia entre isset() y empty()

Empiezo por las formalidades:

Ambas son funciones del lenguaje.

isset informa si un identificador (el nombre de una variable) está definido o no dentro del hilo de ejecución actual (Muy importante entender esto, no se trata de que haya sido definido dentro del archivo actual).

empty indica si el valor asociado a un identificador es o no vacío (La definición de vacío de PHP tiene sus peculiaridades como te voy a mostrar más adelante).

Veamos algunos ejemplos para aclarar el punto:

$a = 0;

if (empty($a)) {
  echo 'empty'.PHP_EOL;
}

if (isset($a)) {
  echo 'isset'.PHP_EOL;
}

Este código dará como salida:

empty

isset

Si se lo ejecuta desde la línea de comandos.

Este otro

if (isset($a)) {
  echo 'isset'.PHP_EOL;
}

$a = 0;

if (empty($a)) {
  echo 'empty'.PHP_EOL;
}

Mostrará en cambio:

empty

Ya que la variable $a recién se define después de la primera verificación.

Es interesante ver el siguiente ejemplo:

if (isset($a)) {
  echo 'isset'.PHP_EOL;
}

if (empty($a)) {
  echo 'empty'.PHP_EOL;
}

Que también dará como resultado

empty

En definitiva, podrías pensar que !isset() es un caso especial de empty().

Respecto de los valores que PHP considera como vacío, son estos:

  • 0
    null
    false
    ""
    "0"
    []
    array()
    0.0

A pesar de que la diferencia parezca sutil, existen casos de uso muy diferentes para cada una.

Una técnica que he visto usada alguna vez para verificar si un archivo ha sido accedido en forma directa o no es verificar si un identificador ha sido definido.

Algo como:

primero.php

<?php

$a = "1";

require_once "segundo.php";

segundo.php

<?php

if ( isset($a) ) {
   ... // Hacer algo util
} else {
   die ('Acceso no autorizado');
}

No sé si es la forma que más me convence, pero funciona. Si alguien quiere acceder ilegalmente a segundo.php no podrá hacerlo.

Un caso de uso deempty sería cuando una variable puede tomar cualquiera de los valores considerados vacíos, pero a los efectos de nuestro script, cualquiera de ellos vale… usando empty la expresión if será mucho más clara que una que tenga todos los || posibles (o bien algo como !in_array()). La desventaja clara de este enfoque es que depende de saber muy bien cuáles son los valores que PHP considera como vacíos… Usualmente yo prefiero dejar la lógica lo más explícita que pueda para evitar sorpresas.

¿Me olvidé de algo importante?

mchojrin
Publicada el
Categorizado como Conceptos

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

4 comentarios

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.