你提到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
/你的构造函数中设置$this
可能是最好的,最简单的办法是有的。
显而易见的解决方案就是'$ this - > _ name = $ params ['name'];'在构造函数中。你的目标是做什么的?解决方案需要比这更复杂吗? –
@ bob-the-destroyer - 提供的例子是一个简化的用例。实际上会有很多属性要设置 - 所有这些属性都是可选的。 –
只是循环'$ this'或'$ params'会解决什么?你提到SPL - 你是否想要将对象的目的表达为一个数组或其他东西? –