использование магического метода __set () с двумерными массивами - PullRequest
3 голосов
/ 13 апреля 2010

Если у меня есть следующий класс реестра:

<code>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)."
"; } } $ reg = новый реестр (); $ reg-> arr = array (1,2,3); $ reg-> arr = array_merge ($ reg-> arr, array (4)); $ Регу-> PRINTALL ();

Есть ли более простой способ поместить новый элемент в массив 'arr'? Этот код: 'array [] = item' не работает с методом магического набора, и я не смог найти полезную информацию в Google. Спасибо за ваше время!

Ответы [ 2 ]

4 голосов
/ 13 апреля 2010

Если у вас есть:

$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);
}
3 голосов
/ 29 января 2012

Вам нужно изменить определение __get (), чтобы оно возвращалось по ссылке:

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