2012-05-28 37 views
0

是否可以使用關聯數組初始化php中的對象私有或受保護成員。PHP - 使用數組參數初始化對象成員

例如:

class TestClass 
{ 
    public $_name; 
    public $_age; 


    public function __construct(array $params) 
    { 
     ?????? 
    } 
} 


$testClass = new TestClass(
    array(
     'name' => 'Bob', 
     'age' => '29', 
    ) 
); 

我想知道是否存在完美的解決方案 - 或許通過實現一個SPL接口或以其他方式?

+0

顯而易見的解決方案就是'$ this - > _ name = $ params ['name'];'在構造函數中。你的目標是做什麼的?解決方案需要比這更復雜嗎? –

+0

@ bob-the-destroyer - 提供的例子是一個簡化的用例。實際上會有很多屬性要設置 - 所有這些屬性都是可選的。 –

+0

只是循環'$ this'或'$ params'會解決什麼?你提到SPL - 你是否想要將對象的目的表達爲一個數組或其他東西? –

回答

2

你提到SPL。但不知道對象的確切要求,下面是我可以給出的唯一信息...

您可以讓您的對象擴展SPL內置類ArrayIterator。然後,而無需在構造函數(父ArrayIterator類已經處理)處理它的關注,你可以導入一個數組到您的對象只是像這樣:

class testClass extends ArrayIterator 
{ 

/* child '__construct' method not required */ 

/* rest of your code here */ 

} 

$t = new testClass(array('name' => 'asdf', 'age' => 99)); 

請記住,默認ArrayIterator行爲,你不能稍後訪問任何傳遞的數組值,就像使用普通對象屬性一樣。你必須訪問它們,你會數組:

echo $t['name']; // 'asdf' 
echo $t->name; // NULL property unknown error 

而且,在內部,傳遞的數組存儲在您的對象中作爲一個單一的私人storage參數。在你的情況下,你已經預先定義好了所有的對象屬性,並且前面加了一個下劃線,所以你可能需要在你的構造函數中手動遍歷$this$params來設置任何實際的對象屬性。

你當然可以重新定義所有子對象的ArrayIterator繼承的方法來處理你的特殊屬性上getset命名情況,但這似乎是多餘的和非生產性的,而不是僅僅遍歷$params /在你的構造設置$this反正。

public function __construct(array $params) 
    { 
     foreach ($params as $key => $val) { 
      if (property_exists($this, "_$key")) { 
       $this->{"_$key"} = $val; 
      } 
     } 
    } 

所以,只要遍歷$params /你的構造函數中設置$this可能是最好的,最簡單的辦法是有的。

3
foreach ($params as $key=>$value) 
{ 
$key = '_'.$key; 
$this->$key=$value; 
} 

看到代碼在線工作樣本here

+1

這就是行'$ key ='_'。 $ key'用於。它將「age」改爲「_age」,將「name」改爲「_name」。 –

+1

用'$ this'替換$ obj'。 – flowfree