从多维数组中获取值而不直接访问它

时间:2012-03-05 01:20:53

标签: php multidimensional-array

我有一个包含各种配置设置的多维数组。这是一个例子:

$ 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()?

1 个答案:

答案 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迭代:))。