PHP

Вложенные массивы и Magic Methods

Наверное всем известно про волшебные(магические) методы в PHP, а конкретно __get и __set методы. Однако есть неприятная особенность, если нужно изменить значение вложенного массива. Для решение этой проблемы есть простое и элегантное решение.

Рассмотри такой вот класс:
    class MyClass {
        protected $data = array('some' => array('sub' => 'data'));
     
        public function __set($name, $value) {
            $this->data[$name] = $value;
        }
        public function __get($name) {
            return $this->data[$name];
        }
    }

Если попытаться изменить значение sub ключа some массива $data таким вот образом:
    $my = new MyClass();
     
    $my->some['sub'] = 'test'; // пытаемся изменить значение
     
    echo $my->some['sub']; // выведет 'data'

Вылезет Notice:
    Notice: Indirect modification of overloaded property MyClass::$some has no effect

Для решения проблемы напишем ещё один класс (у меня он называется ActiveArray, так как является частю моего ActiveRecord):
    class ActiveArray {
        protected $array;
     
        public function __construct($array) {
            $this->array = &$array;
        }
     
        public function __set($name, $value) {
            $this->array[$name] = $value;
        }
     
        public function __get($name) {
            if (is_array($this->array[$name]))
                return new self(&$this->array[$name]);
            else        
                return $this->array[$name];        
        }
    }

И слегка модифицируем метод __get класса MyClass:
        public function __get($name) {
            if(is_array($this->data[$name]))
                return new ActiveArray(&$this->data[$name]);
            else
                return $this->data[$name];
        }

Теперь можно обращатся ко вложенным массивам таким вот образом:
    $my->some->sub = 'test';
    echo $my->some->sub; // выведет 'test'
     
    $my->some = array('abc' => 123);
    echo $my->some->abc; // выведет '123'

Спасибо за внимание!
Добавлено: 23 Августа 2013 12:18:44 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...