あなたは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
/ settingsをループするだけで、おそらく最良で最も単純なソリューションになります。$this