¿Cuál es el mejor método para fusionar dos objetos PHP?

Tenemos dos objetos PHP5 y nos gustaría fusionar el contenido de uno en el segundo. No hay noción de subclases entre ellos por lo que las soluciones descritas en el siguiente tema no se pueden aplicar.

Cómo copiar un objeto PHP en un tipo de objeto diferente

//We have this:
$objectA->a;
$objectA->b;
$objectB->c;
$objectB->d;

//We want the easiest way to get:
$objectC->a;
$objectC->b;
$objectC->c;
$objectC->d;

Observaciones:

  • Estos son objetos, no clases.
  • Los objetos contienen bastantes campos por lo que un foreach sería bastante lento.
  • Hasta ahora hemos considerado transformar los objetos A y B en arrays y luego fusionarlos usando array_merge() antes de volver a transformarlos en un objeto, pero no podemos decir que estemos orgullosos de ello.

Si sus objetos sólo contienen campos (sin métodos), esto funciona:

$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);
Comentarios (0)

Puedes crear otro objeto que envíe las llamadas a los métodos mágicos a los objetos subyacentes. Así es como manejarías __get, pero para que funcione completamente tendrías que sobreescribir todos los métodos mágicos relevantes. Es probable que encuentres errores de sintaxis, ya que sólo lo he escrito de memoria.

class Compositor {
  private $obj_a;
  private $obj_b;

  public function __construct($obj_a, $obj_b) {
    $this->obj_a = $obj_a;
    $this->obj_b = $obj_b;
  }

  public function __get($attrib_name) {
    if ($this->obj_a->$attrib_name) {
       return $this->obj_a->$attrib_name;
    } else {
       return $this->obj_b->$attrib_name;
    }
  }
}

Buena suerte.

Comentarios (6)
foreach($objectA as $k => $v) $objectB->$k = $v;
Comentarios (3)