PHP - 使用数组参数初始化对象成员

时间:2012-05-28 19:05:22

标签: php spl

是否可以使用关联数组初始化php中的私有对象或受保护成员。

例如:

    class TestClass
{
    public $_name;
    public $_age;


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


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

我想知道是否有一个优雅的解决方案 - 也许是通过实现一个spl接口或其他?

2 个答案:

答案 0 :(得分:3)

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

在线查看工作样本here

的代码

答案 1 :(得分: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 / setting $this,这可能是最好的,最简单的解决方案。