2012-03-06 14 views
7

Supongamos que tengo:¿Cómo completo un objeto en PHP desde una matriz

class A{ 
public $one; 
public $two; 
} 

y una matriz con valores:

array('one' => 234, 'two' => 2) 

hay una manera de tener una instancia de un lleno los valores correctos de la matriz de forma automática?

+0

Defina * automáticamente *. ¿La instancia de 'A' ya existe o debe crearse? Si es así, ¿con o sin llamar al constructor de esa instancia? – hakre

+1

Duplicado de [PHP: ¿Cómo convertir una matriz en un objeto StdClass]? http://stackoverflow.com/questions/1885160/php-how-to-turn-an-array-into-a-stdclass-object –

+0

@ Rob2211: Busqué también, pero 'A' no es' StdClass' . – hakre

Respuesta

13

Tiene que escribir una función para eso. PHP tiene get_object_varsDocs pero no establece contraparte:

function set_object_vars($object, array $vars) { 
    $has = get_object_vars($object); 
    foreach ($has as $name => $oldValue) { 
     $object->$name = isset($vars[$name]) ? $vars[$name] : NULL; 
    } 
} 

Uso:

$a = new A(); 
$vars = array('one' => 234, 'two' => 2); 
set_object_vars($a, $vars); 
+0

¡Brillante! ¿Qué necesitaría cambiar para obtener el mismo efecto para otros 2 pasos de dimensión? $ object ['x'] ['y'] ['z']; –

0

Sí, sí.

Usted podría utilice un método de paso directo.

Por ejemplo:

class A { 
    public $one, $tow; 
    function __construct($values) { 
     $this->one = $values['one'] ?: null; 
     $this->two = $values['two'] ?: null; 
    } 
} 

$a = new A(array('one' => 234, 'two' => 2)); 
+0

Casi automático. –

+0

@ Rob2211 cierto, pero es lo mejor que se me ocurre. – Neal

2

Si desea permitir la mayor de establecimiento de atributos, también puede guardarlas como una propiedad. Te permite encapsular dentro de la clase un poco mejor.

class A{ 
    protected $attributes = array(); 
    function setAttributes($attributes){ 
    $this->attributes = $attributes; 
    } 

    public function __get($key){ 
    return $this->attributes[$key]; 
    } 

} 
1

versión @hakre es bastante bueno, pero peligroso (supongamos que un Identificación o la contraseña está en ver estos apoyos).

me gustaría cambiar el comportamiento predeterminado para que:

function set_object_vars($object, array $vars) { 
    $has = get_object_vars($object); 
    foreach ($has as $name => $oldValue) {   
     array_key_exists($vars[$name]) ? $object->$name =$vars[$name] : NULL; 
    } 
} 

aquí, las propiedades anteriores que no están en la gama $ vars no se ven afectados.
y si desea establecer un apoyo para nulo a propósito, puede hacerlo.

Cuestiones relacionadas