2014-01-24 121 views
8

我有一個函數,它應該讀取數組並動態設置對象屬性。PHP動態設置對象屬性

class A { 
    public $a; 
    public $b; 

    function set($array){ 
     foreach ($array as $key => $value){ 
      if (property_exists ($this , $key)){ 
       $this->{$key} = $value; 
      } 
     } 
    } 
} 

$a = new A(); 
$val = Array("a" => "this should be set to property", "b" => "and this also"); 
$a->set($val); 

那麼,顯然它不工作,有沒有辦法做到這一點?

編輯

似乎沒有什麼不對這個代碼,這個問題應該關閉

+2

刪除括號{}並且會工作! - >'$ this - > $ key = $ value;' –

+0

好吧,這顯然正在工作......,剛剛在php 5.4 – Dysosmus

+0

上測試過,祝福我的鬍子! – Benedictus

回答

8

http://www.php.net/manual/en/reflectionproperty.setvalue.php

可以使用Reflection,我想。

<?php 

function set(array $array) { 
    $refl = new ReflectionClass($this); 

    foreach ($array as $propertyToSet => $value) { 
    $property = $refl->getProperty($propertyToSet); 

    if ($property instanceof ReflectionProperty) { 
     $property->setValue($this, $value); 
    } 
    } 
} 

$a = new A(); 

$a->set(
    array(
    'a' => 'foo', 
    'b' => 'bar' 
) 
); 

var_dump($a); 

輸出:

object(A)[1] 
    public 'a' => string 'foo' (length=3) 
    public 'b' => string 'bar' (length=3) 
+0

你可以,但爲什麼使用它,如果簡單的setter會做 – eis

+0

已回答,因爲發佈的東西有用 – Benedictus

20

你只需要去掉括號{},並將努力! - >$this->$key = $value;