Un objeto es uno de los tipos de dato más usados en programación. Un objeto es una colección de datos relacionados, almacenados como pares de clave-valor. Cuando trabajes con objetos o variables en tus aplicaciones PHP, especialmente en frameworks, es fundamental saber cómo verificar si están vacíos antes de ejecutar ciertas operaciones. En PHP, existen varias funciones y métodos para realizar estas comprobaciones.
Uso de la Función PHP empty()
La función de PHP empty() se utiliza para comprobar variables y arrays. Cuando utilizas empty() te devuelve un valor booleano: true (o su equivalente 1) si la variable está vacía y false (o 0) si la variable o array no está vacío.
Una de las ventajas clave de empty() es que no generará advertencias si estás comprobando una variable indefinida, a diferencia de una simple comprobación booleana directa. Esto la convierte en una herramienta segura para la validación de entrada de usuario o variables que pueden no estar siempre presentes.
Considera los siguientes ejemplos de comprobaciones:
if ($flagvar) // Podría generar una advertencia si $flagvar no está definida
if (isset($flagvar) && $flagvar) // Comprobación segura y explícita
if (!empty($flagvar)) // Comprobación segura y concisa
Lea también: IVA 21% Excel
Comportamiento de empty() con Objetos y Métodos Mágicos
Cuando empty() se llama en variables no existentes o no públicas de una clase, los resultados pueden ser un poco confusos, especialmente si se utiliza el método mágico __get. Ninguna alerta es generada si la variable no existe directamente.
El resultado para empty($registry->notEmpty) es un poco inesperado, ya que el valor está obviamente definido y no está vacío. Esto se debe al hecho de que la función empty() utiliza la función mágica __isset() en estos casos. Aunque se menciona en la documentación, es un comportamiento que merece ser detallado, ya que no es directo. Para empty($myClass->foo), PHP llama a __isset, y si eso es true, devuelve el resultado de empty sobre el resultado de __get.
Llamar a una propiedad de objeto no existente, empty($object->prop), activará __isset(), de la misma manera que lo hace isset($object->prop), pero hay una diferencia. Se confirman esos resultados, y si se extiende la prueba con isset($x->a->b->c), parece que __isset solo se llama para la última propiedad en la cadena, lo cual es posiblemente otro error o un comportamiento a tener en cuenta.
Surgió la pregunta: "¿Por qué esto devuelve TRUE para variables no definidas?", y la explicación se encontró en el comportamiento de empty() al interactuar con las propiedades de los objetos y los métodos mágicos.
Casos Especiales y Consideraciones de empty()
La función empty() considera vacíos varios valores que podrían no ser intuitivos:
Lea también: Guía IVA reducido
- Valores como "0" (cero como cadena), 0 (cero como entero) y -0 (menos cero como entero) devuelven true. Sin embargo, "-0" (menos cero como cadena, que algunos usuarios pueden introducir) devuelve false.
- Es importante notar que si tu variable solo contiene un "salto de línea" (también conocido como retorno de carro), PHP_EOL, no se considera vacía.
- Es importante tener en cuenta que empty() devolverá false para un byte nulo.
empty() no debería necesariamente devolver la negación del resultado de la función mágica __isset(); si se establece un miembro de datos a 0, isset() debería devolver true y empty() también debería devolver true.
En algunas situaciones, empty() podría no ser adecuada, por ejemplo, cuando el valor '0' no se considera vacío en un contexto particular de tu aplicación. La afirmación de que la ÚNICA razón para usar empty() es la legibilidad del código NO es cierta, ya que también ofrece seguridad al no disparar advertencias para variables indefinidas.
Es importante destacar que si se comprueba la existencia de una subclave de un array que no existe, pero su elemento padre sí y es una cadena, empty() devolverá false.
La Función PHP isset()
La función de PHP isset() es fundamental para la validación, ya que valida si una variable está definida y no es null. A menudo se utiliza en combinación con otras comprobaciones para asegurar que una variable existe y tiene un valor antes de intentar acceder a ella. Como se mencionó anteriormente, empty() utiliza __isset() internamente para propiedades de objetos.
Otras Formas de Comprobar si un Array está Vacío en PHP
Más allá de empty(), existen otras formas de verificar si un array o una estructura de datos es equivalente a estar vacía, lo cual es útil para realizar validaciones rápidas en tu código.
Lea también: ¿Cómo localizar tus XML del SAT?
- La función de PHP sizeof(), según la documentación oficial de PHP, es un alias de la función count(). Cuando usas sizeof() para verificar si un array está vacío, lo que hace es devolver el tamaño del array en un entero. Si regresa un cero, significa que el array está vacío.
- Otra función que puedes utilizar para verificar si un array está vacío es count(). Esta función cuenta todos los elementos en un array o algo de un objeto. Un resultado de 0 indica que está vacío.
- Otra forma rápida para comprobar si un array está vacío es usando el operador lógico NOT (la manera abreviada para utilizar NOT es el símbolo “!”). Por ejemplo, if (!$myArray) puede funcionar en ciertos contextos, aunque hay que tener cuidado con las coerciones de tipo de PHP.
Rendimiento de las Comprobaciones de Vaciedad
Se realizó un breve estudio de rendimiento sobre las formas más comunes de comprobar la vaciedad. En resumen, no importa qué método se utilice de manera crítica, aunque empty() es en realidad solo un poco más lento a pesar de ser una construcción del lenguaje.
Aquí se presenta una tabla ilustrativa de los tiempos de ejecución relativos para diferentes métodos de comprobación de la vaciedad, basados en los benchmarks mencionados:
| Método de Comprobación | Tiempo de Ejecución Relativo (unidades arbitrarias) |
|---|---|
| count($array_vacío) | X |
| count($array_no_vacío) | X + 0.1 |
| $array_vacío === [] | Y |
| $array_no_vacío === [] | Y + 0.1 |
| empty($array_vacío) | Z (ligeramente mayor que X, Y) |
| empty($array_no_vacío) | Z + 0.1 |
Aunque las diferencias son mínimas en la mayoría de los escenarios de aplicaciones, para operaciones de alta frecuencia en bucles muy grandes, estas pequeñas diferencias podrían sumarse. No obstante, la claridad y la seguridad del código suelen tener prioridad.
