2012-01-03 17 views
12

Tengo un objeto en PHP, del tipo MyObject.PHP copie todas las propiedades de objeto a este

$myObject instanceof MyObject 

Ahora, en el class MyObject, hay una función no estático, y de allí, yo uso la referencia al "yo", como $this, pero también tengo otro objeto allí.

¿Es posible, sin hacer $this = $myObject, para lograr más o menos el mismo efecto, como algo por el estilo set_object_vars($this, get_object_vars($myObject))?

+0

¿Qué quiere decir "* use la referencia a 'mí', como' $ this' * ", ¿está aliasing' $ this' en el método? – Dan

+1

¿Qué tal si publica el código? –

+0

Creo que su pregunta necesita una pequeña revisión. Incluso si tuviéramos una función set_object_vars() ¿sería realmente el mismo efecto? Estarías copiando el objeto, no haciendo referencia a él. Ver copia vs referencia en PHP para más. – Slavic

Respuesta

39
<?php 

class MyObject 
{ 
    public function import(MyObject $object) 
    { 
     foreach (get_object_vars($object) as $key => $value) { 
      $this->$key = $value; 
     } 
    } 
} 

hará lo que usted quiere, supongo, pero usted debe ser consciente de los siguientes:

  1. get_object_vars sólo encontrará propiedades no estáticos
  2. get_object_vars sólo encontrará propiedades accesibles según alcance

El según alcance es bastante importante y puede merecer un poco más de explicación. ¿Sabía que el alcance de las propiedades es dependiente de la clase en lugar de dependiente de la instancia en PHP?

Esto significa que en el ejemplo anterior, si usted tenía una propiedad en private $barMyObject, get_object_vars lo vería, ya que estás en una instancia de una clase MyObject. Evidentemente, esto no funcionará si está intentando importar instancias de otra clase.

+0

Gracias! ¡No pensé si eso! Ahora, solo necesito copiar las propiedades a la instancia, las propiedades estáticas son irrelevantes ^^ – arik

0

@Geoffrey Bachelet podemos mejorar esta:

class MyObject 
{ 
    //object or array as parameter 
    public function import($object) 
    { 
     $vars=is_object($object)?get_object_vars($object):$object; 
     if(!is_array($vars)) throw Exception('no props to import into the object!'); 
     foreach ($vars as $key => $value) { 
      $this->$key = $value; 
     } 
    } 
} 

La diferencia es aquí donde se puede pasar una matriz común (tabla hash), así como un objeto. Piense en el ejemplo sobre algunos datos que provienen de la base de datos.

Cuestiones relacionadas