是否可以使用关联数组在 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
继承方法来处理get
或set
上的特殊属性命名情况,但这似乎是多余的和无效的,而不是只是在构造函数中循环$params
/set $this
。
public function __construct(array $params)
{
foreach ($params as $key => $val) {
if (property_exists($this, "_$key")) {
$this->{"_$key"} = $val;
}
}
}
因此,在构造函数中循环$params
/set $this
可能是最好、最简单的解决方案。