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


PHP - Initialize object members with array parameter

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

例如:

    class TestClass
{
    public $_name;
    public $_age;

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

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

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

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

在此处查看在线工作示例的代码

你提到了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/set $this

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

因此,在构造函数中循环$params/set $this可能是最好、最简单的解决方案。