使用魔术方法__set()处理二维数组

3
如果我有以下的注册表类:
Class registry 
{
    private $_vars;

    public function __construct()
    {
        $this->_vars = array();
    }

    public function __set($key, $val)
    {
        $this->_vars[$key] = $val;
    }

    public function __get($key)
    {
        if (isset($this->_vars[$key]))
            return $this->_vars[$key];
    }

    public function printAll()
    {
        print "<pre>".print_r($this->_vars,true)."</pre>";
    }
}

$reg = new registry();

$reg->arr = array(1,2,3);
$reg->arr = array_merge($reg->arr,array(4));

$reg->printAll();

有没有更简单的方法将新项推入'arr'数组中?这段代码:“array[] = item”无法使用神奇设置方法,并且我在谷歌上找不到任何有用的信息。感谢您的时间!


@Spoonface,你希望在两个__set()调用之后_vars看起来像什么?是array("arr" => array(1,2,3,4))吗? - maček
没错,它应该看起来像这样:_vars => array('arr' => array(1,2,3,4))。 - Spoonface
2个回答

4

如果您拥有以下内容:

$reg = new registry();
$reg->arr = array(1,2,3);
$reg->arr = 4;

你期望的是:

Array
(
    [arr] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )

)

您需要做的就是更新您的__set方法:

public function __set($key, $val){
  if(!array_key_exists($key, $this->_vars)){
    $this->_vars[$key] = array();
  }
  $this->_vars[$key] = array_merge($this->_vars[$key], (array)$val);
}

嗨,那是一个相当不错的解决方案,非常感谢! - Spoonface
它在有限的情况下工作。不过,好像不可能使用__set来更新数组。 - Vlad
@Vlad,我对此表示怀疑。如果您想粘贴一个示例,我很愿意帮助您解决问题。 - maček

3

您需要修改__get()方法的定义,使其返回引用:

public function &__get($key) {
  return $this->_vars[$key];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接