2011-09-02 48 views
1

是否有可能具有這樣的構造。說我有一個這樣的數組:使用數組鍵將屬性添加到對象

$names = array ('name1', 'name2', 'name3'); 
$values = array ('value1', 'value2', 'value3'); 

然後,我要做到以下幾點:

foreach ($names as $field) { 
    $this->$field = $values[$counter]; 
    $counter ++; 
} 

這樣,以後,我可以訪問上述目標是這樣的:

$var1 = $object->name1; 
$var2 = $object->name2; 

// produces "value1" 
echo $var1; 

// produces "value2" 
echo $var2; 

我想要做的是擁有一個動態命名字段的對象。 OO PHP有可能嗎?

+1

是的。你沒有嘗試過嗎?雖然上面的代碼不會起作用,因爲你需要執行'foreach($ names = $ k => $ name)$ this - > $ name = $ values [$ k];' – DaveRandom

+0

@DaveRandom:代碼與'$ counter '。不是我會去的方式,但結果是一樣的。 – webbiedave

+1

我認爲這個問題已經在這裏解答:http://stackoverflow.com/questions/829823/can-you-create-class-properties-dynamically-in-php – Sam

回答

3

是的,你可以

$object = (object)array_combine($names , $values); 

至於建議由@Sam的Magic __set method工作得更好

+0

謝謝!這是一個很好的解決方案:) – Shade

4

是的,這會工作,但一般變量變量都望而卻步。

也許更優雅的解決辦法是使用__get magic method的類像這樣:然後

class Person 
{ 
    public function __construct($vars) 
    { 
     $this->vars = $vars; 
    } 

    public function __get($var) 
    { 
     if (isset($this->vars[$var])) { 
      return $this->vars[$var]; 
     } 

     return null; 
    } 
} 

的瓦爾陣列將工作像這樣:

$vars = array(
    'name1' => 'value1', 
    'name2' => 'value2', 
    'name3' => 'value3', 
); 

$object = new Person($vars); 

或者,如果你特別希望從兩個陣列構建它:

$vars = array_combine($names, $values) 
1

使用特殊配置您可以使用以下語法訪問成員:

$object = new ArrayObject(array_combine($names, $values), ArrayObject::ARRAY_AS_PROPS); 

echo $object->name1; // value1 
echo $object['name1']; // value1