【问题标题】:using the magic __set() method with 2D arrays使用带有 2D 数组的魔法 __set() 方法
【发布时间】:2015-12-31 07:07:48
【问题描述】:

如果我有以下注册表类:

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,你希望_vars 在两次__set() 通话后看起来像什么? array("arr" =&gt; array(1,2,3,4))?
  • 是的,没错,它应该看起来像:_vars => array('arr' => array(1,2,3,4))。

标签: php class multidimensional-array magic-methods


【解决方案1】:

如果你有:

$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);
}

【讨论】:

  • 你好,这是一个很好的解决问题的方法,非常感谢!
  • 不过,它在有限的情况下有效。使用 __set 来更新数组似乎是不可能的。
  • @Vlad,我怀疑情况是否如此。如果您想粘贴一个示例,我愿意帮助您完成它。
【解决方案2】:

您需要更改 __get() 的定义,以便它通过引用返回:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多