2012-03-06 15 views
7

varsayalım Ben:Nasıl bir Array gelen PHP bir nesne dolduruyorsunuz

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

ve değerlerle bir dizi:

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

A ile dolu bir örneğini için bir yol yoktur diziden doğru değerler otomatik olarak mı?

+0

* Otomatik olarak tanımla *. "A" örneği zaten var mı yoksa oluşturulmalı mı? Varsa, bu örneğin kurucusunu çağırmadan veya çağırmadan? – hakre

+1

[PHP: Bir diziyi StdClass nesnesine dönüştürme] nasıl yapılır? http://stackoverflow.com/questions/1885160/php-how-to-turn-an-array-into-a-stdclass-object –

+0

@ Rob2211: Ben de aradım, ama '' '' StdClass' değil . – hakre

cevap

13

Bunun için kendinize bir işlev yazmanız gerekir. PHP get_object_varsDocs var ama hiçbir muadili ayarlayın:

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

Kullanımı:

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

Parlak! Başka bir 2 boyut adımı için aynı etkiyi elde etmek için neyi değiştirmem gerekir? $ Nesne [x '] [ 'y'] [ 'z']; –

0

Evet var.

geçiş yöntemini kullanabilirsiniz. Örneğin

: Eğer niteliklerin toplu ayarı için izin vermek istiyorsanız

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

Çok otomatik. –

+0

@ Rob2211 Doğru, ama düşünebildiğim en iyisi. – Neal

2

, ayrıca bir özelliği olarak bunları saklayabilir. Sınıf içinde biraz daha iyi kapsama alanı sağlar.

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

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

} 
1

@hakre sürümü oldukça iyi, ama tehlikelidir (bir id veya şifre Thoses sahne olduğunu varsayalım).

Bunun için varsayılan davranışı değiştirmek olacaktır: Burada

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

, $ olmayan önceki özellikler dizisi etkilenmez vars.
ve null değerine amaç için bir prop ayarlamak istiyorsanız, yapabilirsiniz.