2012-03-06 13 views
7

Załóżmy, że mam:Jak wypełnić obiekt w PHP z tablicy

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

i tablicę z wartościami:

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

istnieje sposób mieć instancję wypełnione odpowiednie wartości z tablicy automatycznie?

+0

Definiuj * automatycznie *. Czy instancja "A" już istnieje, czy też musi zostać utworzona? Jeśli tak, z lub bez wywoływania konstruktora tej instancji? – hakre

+1

Duplikat [PHP: Jak zmienić tablicę w obiekt StdClass]? http://stackoverflow.com/questions/1885160/php-how-to-turn-an-array-into-a-stdclass-object –

+0

@ Rob2211: Szukałem również, ale 'A' nie jest' StdClass' . – hakre

Odpowiedz

13

Musisz napisać do tego funkcję. PHP ma get_object_varsDocs ale nie ustawić odpowiednika:

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; 
    } 
} 

Zastosowanie:

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

Genialny! Co powinienem zmienić, aby uzyskać ten sam efekt dla kolejnych 2-wymiarowych kroków? $ object ['x'] ['y'] ['z']; –

0

Tak, istnieje.

Możesz może użyć metody pass thru.

Na przykład:

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

Trudno automatyczne. –

+0

@ Rob2211 prawda, ale jest to najlepsze, co mogę wymyślić. – Neal

2

Jeśli chcesz, aby umożliwić luzem ustalania atrybutów, można również zapisać je jako własność. Pozwala ci to trochę lepiej zamknąć w klasie.

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

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

} 
1

wersja @hakre jest dość dobra, ale niebezpieczne (Załóżmy, że id lub hasło jest w thoses rekwizyty).

chciałbym zmienić domyślne zachowanie się, że:

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; 
    } 
} 

tutaj, poprzednie właściwości, które nie są w $ vars array nie są naruszone.
a jeśli chcesz ustawić rekwizyt o wartości zerowej celowo:, możesz.