0

連想配列を使用して、PHPのプライベートまたは保護されたメンバーのオブジェクトを初期化することは可能ですか?

例えば:

    class TestClass
{
    public $_name;
    public $_age;


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


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

私はエレガントな解決策があるかどうか疑問に思っていました-おそらく1つをsplインターフェースを実装することによってかそうでないか?

4

2 に答える 2

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

こちらの作業サンプルについては、オンラインのコードを参照してください

于 2012-05-28T19:06:35.543 に答える
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/ settingsをループするだけで、おそらく最良で最も単純なソリューションになります。$this

于 2012-05-28T20:51:08.973 に答える