你提到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
繼承的方法來處理你的特殊屬性上get
或set
命名情況,但這似乎是多餘的和非生產性的,而不是僅僅遍歷$params
/在你的構造設置$this
反正。
public function __construct(array $params)
{
foreach ($params as $key => $val) {
if (property_exists($this, "_$key")) {
$this->{"_$key"} = $val;
}
}
}
所以,只要遍歷$params
/你的構造函數中設置$this
可能是最好的,最簡單的辦法是有的。
顯而易見的解決方案就是'$ this - > _ name = $ params ['name'];'在構造函數中。你的目標是做什麼的?解決方案需要比這更復雜嗎? –
@ bob-the-destroyer - 提供的例子是一個簡化的用例。實際上會有很多屬性要設置 - 所有這些屬性都是可選的。 –
只是循環'$ this'或'$ params'會解決什麼?你提到SPL - 你是否想要將對象的目的表達爲一個數組或其他東西? –