是否可以使用关联数组初始化php中的私有对象或受保护成员。
例如:
class TestClass
{
public $_name;
public $_age;
public function __construct(array $params)
{
??????
}
}
$testClass = new TestClass(
array(
'name' => 'Bob',
'age' => '29',
)
);
我想知道是否有一个优雅的解决方案 - 也许是通过实现一个spl接口或其他?
答案 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
继承方法来处理get
或set
上的特殊属性命名案例,但这似乎是多余的,没有效果而不仅仅是无论如何,在构造函数中循环遍历$params
/设置$this
。
public function __construct(array $params)
{
foreach ($params as $key => $val) {
if (property_exists($this, "_$key")) {
$this->{"_$key"} = $val;
}
}
}
因此,只需在构造函数中循环$params
/ setting $this
,这可能是最好的,最简单的解决方案。