你提到了 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 。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
可能是最好、最简单的解决方案。