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?
- Cómo enviarencabezados SOAP desde PHP - 09/12/2024
- Por qué PHP 8 no satisface el requisito ^7.3 de composer - 09/12/2024
- Cómo usar PHPUnit - 03/12/2024
Yo añadiría el caso de $a = null;
https://twitter.com/mchojrin/status/1021911848076169217
Mi experiencia es que confunde a los principiantes (y a muchos veteranos).
Muchas gracias Gorka! Muy buen aporte 🙂
Hola,
No sé si será importante o no, pero te has dejado atrás más casos de empty:
* 0
* «0»
* 0.0
* null
* false
* “”
* array() //array vacío
Saludos
Muchas gracias Manuel! Voy a verlo bien y actualizar el post ?