我有一个包含各种配置设置的多维数组。这是一个例子:
$ this-> data = array();
我希望这个数组是私有的,所以我创建了一个getter:
public function getData(){
$args = func_get_args();
$x = $this->data;
foreach($args as $arg) $x = $x[$arg];
return $x;
}
我这样用它:
$value = $obj->getData('country', 'city', 'street');
一切正常,但问题是它比直接访问慢5倍(经过100,000次迭代测试):
$value = $obj->data['country']['city']['street'];
最好的方法是什么?有没有办法让这个变量只读,或者有更好的方法来访问它而不使用foreach()?
答案 0 :(得分:0)
您可以使用__get
魔术方法创建getter:
public function __get($name) {
return $this->$name;
}
通过这种方式,您可以得到保护和保护。私有财产来自任何地方,但只能在你的班级内设置。
如果您只希望此属性以这种方式运行,只需使用条件:
public function __get($name) {
return $name === 'data' ? $this->data : null;
}
当然,__get
甚至比方法getter慢一点,但是只需要调用一次来访问data
属性,并且对它的任何子数组的每次访问都将是和直接访问一样快(这意味着没有丑陋的foreach
迭代:))。