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?
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?
Musisz napisać do tego funkcję. PHP ma get_object_vars
Docs 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);
Genialny! Co powinienem zmienić, aby uzyskać ten sam efekt dla kolejnych 2-wymiarowych kroków? $ object ['x'] ['y'] ['z']; –
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));
Trudno automatyczne. –
@ Rob2211 prawda, ale jest to najlepsze, co mogę wymyślić. – Neal
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];
}
}
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.
Definiuj * automatycznie *. Czy instancja "A" już istnieje, czy też musi zostać utworzona? Jeśli tak, z lub bez wywoływania konstruktora tej instancji? – hakre
Duplikat [PHP: Jak zmienić tablicę w obiekt StdClass]? http://stackoverflow.com/questions/1885160/php-how-to-turn-an-array-into-a-stdclass-object –
@ Rob2211: Szukałem również, ale 'A' nie jest' StdClass' . – hakre