Использование магического метода __set() с двумерными массивами
Если у меня есть следующий класс реестра:
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' не работает с методом магического набора, и я не смог найти полезную информацию в Google. Спасибо за ваше время!
2 ответа
Решение
Если у вас есть:
$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);
}
Вам нужно изменить определение __get(), чтобы оно возвращалось по ссылке:
public function &__get($key) {
return $this->_vars[$key];
}