Por qué empty() no funciona con objetos vacíos en PHP?

Cuando trabajas con PHP, es común querer comprobar si una variable está «vacía». Si estás manejando objetos, probablemente te hayas encontrado con este comportamiento inesperado:

<?php
$obj = new stdClass();
print_r($obj);

 

Este código imprime:

stdClass Object ( )

 

¡Claramente no contiene nada! Pero si evaluamos con empty():

<?php
var_dump(empty($obj)); // false

Esto devuelve false. ¿Cómo puede ser que algo que se ve vacío no sea considerado vacío? A continuación te explicamos por qué sucede esto y cómo solucionarlo correctamente.

 

Qué considera PHP como «vacío»?

La función empty()en PHP evalúa si una variable no existe o tiene un valor «falsy», lo cual incluye:

  • ""(cadena vacía)
  • 0(entero)
  • "0"(cadena con cero)
  • null
  • false
  • [](arreglo vacío)
  • variables no definidas

Pero atención: los objetos no están en esta lista. Aunque un objeto no tenga propiedades, sigue siendo una instancia válida de una clase, y por lo tanto PHP lo considera como «no vacío».

 

El problema con empty($obj)

<?php
$obj = new stdClass();

if (empty($obj)) {
    echo "El objeto está vacío.";
} else {
    echo "El objeto NO está vacío.";
}

 

Este código muestra:

El objeto NO está vacío.

Esto sucede porque $objes una instancia activa de stdClass. No importa si tiene propiedades o no, PHP lo considera como un valor válido (truthy).

 

¿Cómo comprobar si un objeto realmente está vacío?

Generalmente, lo que queremos saber es si un objeto tiene propiedades definidas. Para eso, podemos convertir el objeto a un arreglo y luego evaluar si el arreglo está vacío:

<?php
$obj = new stdClass();

if (empty((array) $obj)) {
    echo "El objeto no tiene propiedades.";
} else {
    echo "El objeto tiene propiedades.";
}

 

Este código ahora sí imprimirá:

El objeto no tiene propiedades.

 

También puedes encapsular esta lógica en una función reutilizable:

<?php
function isObjectEmpty($obj): bool {
    return empty((array) $obj);
}

 

Ejemplo de uso:

<?php
$obj = new stdClass();
var_dump(isObjectEmpty($obj)); // true

$obj->name = "Ejemplo";
var_dump(isObjectEmpty($obj)); // false

 

Casos de uso comunes

Este tipo de verificación es útil cuando:

  • Estás trabajando con datos JSON que han sido decodificados como objetos.
  • Estás integrando una API y necesitas validar si la respuesta contiene información.
  • Usas objetos como contenedores temporales de datos.

 

En PHP, los objetos nunca son considerados vacíos por la función empty(), incluso si no tienen ninguna propiedad. Si necesitas verificar que un objeto está realmente vacío, la forma correcta de hacerlo es convertirlo a un arreglo:

<?php
empty((array) $obj)

Este pequeño truco te permite evaluar correctamente estructuras de datos vacías y evitar errores lógicos en tu código.

 

 

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to Top
0
Would love your thoughts, please comment.x
()
x