¿Cómo funciona stdClass? (Métodos mágicos)

A todos en un momento de nuestra vida nos ha llegado esta duda, así que en este artículo vamos a ver como hace stdClass para crear a atributos que no están definidos en la clase.

¿Cómo puedo crear atributos que no están definidos en el objeto?

Vamos a descubrirlo …

Antes que nada tenemos que tener claro que es exactamente la clase stdClass

¿Qué es stdClass?

Es una clase predefinida en php, que no tiene ningún atributo ni métodos.
Y la podemos usar cuando queremos crear un objeto genérico al que después podemos agregar propiedades.

Vamos a ver como funciona:

<?php  
  $user = new stdClass;
  $user->name = 'Miguel';
  /*
  stdClass Object
  (
      [name] => Miguel
  )
  */
?>

¿Cómo está creando un atributo que no existe?

Métodos mágicos en PHP

Son propiedades o funciones que se ejecutan por invocación a través de eventos que suceden sobre el objeto.

Son las siguientes:

  • __construct(): Se ejecuta en la creación del objeto.

  • __destruct(): Se llama cuando se elimina el objeto.

  • __call(): Se lanza cuando se intenta acceder a un método al que no se tiene acceso (privado, protegido).

  • __callStatic(): Igual que call, pero para métodos en un contexto estático.

  • __get(): Se utiliza para consultar datos a partir de propiedades inaccesibles.

  • __set(): Se ejecuta al escribir datos sobre propiedades inaccesibles.

  • __isset(): Se lanza al llamar a isset() o a empty() sobre propiedades inaccesibles.

  • __unset(): Se invoca cuando se usa unset() sobre propiedades inaccesibles.

  • __sleep(): Se ejecuta antes de cualquier serialización. Devuelve un array con las keys que queremos serializar, para evitar algunos campos.

  • __wakeup(): Es usado para restablecer las conexiones de base de datos que se puedan haber perdido durante la serialización y realizar otras tareas de reinicialización.

  • __toString(): Nos permite crear nuestra implementación a la representación en String de nuestro objeto.

  • __invoke(): Es llamado cuando un script intenta llamar a un objeto como si fuera una función.

  • _setstate(): Este método static es llamado para las clases exportadas por var_export().

  • _clone(): Una vez que la clonación ha finalizado, se llamará al método _clone() del nuevo objeto (si el método __clone() estuviera definido), para permitirle realizar los cambios necesarios sobre sus propiedades.

  • _debugInfo(): Este método es invocado por vardump() al volcar un objeto para obtener las propiedades que deberían mostrarse.

Estos son todos los eventos mágicos que podemos usar. Si nos damos cuenta en lo que hacen cada uno para implementar la funcionalidad de stdClass tenemos que usar __set().

Veamos con un ejemplo como se implementaría:

class myObject  
{
  public function __set($name, $value) {
    $this->{$name} = $value;
  }
}

y lo usaríamos como normalmente usamos stdClass

$obj = new myObject;

$obj->nombre = "Miguel";
$obj->apellido = "Rodríguez";

print_r($obj);

/* Salida:
myObject Object  
(
    [nombre] => Miguel
    [apellido] => Rodríguez
)
*/

Conclusión

Los eventos mágicos pueden ser interesantes para detectar eventos y realizar acciones que veamos pertinentes para cada problema.

Pero tenemos que tener cuidado, dado que una implementación descuidad nos dará problemas de seguridad Ataques de PHP Object Injection en aplicaciones web