0

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

例如:

    class TestClass
{
    public $_name;
    public $_age;


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


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

我想知道是否有一个优雅的解决方案 - 也许通过实现一个 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无论如何在构造函数中设置任何真实对象属性。

您当然可以重新定义所有子对象的继承方法来处理您在orArrayIterator上的特殊属性命名情况,但这似乎是多余的且没有效率,而不是在构造函数中循环/setting 。getset$params$this

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

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

于 2012-05-28T20:51:08.973 回答