Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.55 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Обёртка массива, хранилище.
  4.  * Попытка реализации объекта для более удобной работы с массиво-образной структурой данных
  5.  * в рамках OO-ориентированных PHP-приложений.
  6.  */
  7. abstract class Cover_Abstract_Array extends Cover_Abstract_Simple implements IteratorAggregate, Countable, ArrayAccess
  8. {
  9.     public function __set($key, $value)
  10.     {
  11.         $this->data[$key] = is_array($value) ? new $this($value) : $value;
  12.     }
  13.  
  14.     public function __toString()
  15.     {
  16.         return $this->data ? strval(current($this->data)) : '';
  17.     }
  18.  
  19.     /**
  20.      * Реализация интерфейса Countable
  21.      *
  22.      * @access public
  23.      * @param void
  24.      * @return int
  25.      */
  26.     public function count()
  27.     {
  28.         return count($this->data);
  29.     }
  30.  
  31.     /**
  32.      * Реализация интерфейса IteratorAggregate
  33.      *
  34.      * @access public
  35.      * @param void
  36.      * @return ArrayIterator
  37.      */
  38.     public function getIterator()
  39.     {
  40.         return new ArrayIterator($this->data);
  41.     }
  42.  
  43.     /**
  44.      * Возвращает элемент коллекции с заданным индексом в качестве результата.
  45.      * Аналог parent::__get, но предназначен для числовых индексов.
  46.      *
  47.      * @access public
  48.      * @param mixed
  49.      * @return mixed
  50.      */
  51.     public function item($key)
  52.     {
  53.         return isset($this->data[$key]) ? $this->data[$key] : null;
  54.     }
  55.  
  56.     /**
  57.      * Присоединяет один элемент в начало массива.
  58.      *
  59.      * @access public
  60.      * @param mixed
  61.      * @return object
  62.      */
  63.     public function prepend($value)
  64.     {
  65.         array_unshift($this->data, self::array2cover($value));
  66.  
  67.         return $this;
  68.     }
  69.  
  70.     /**
  71.      * Присоединяет один элемент в конец массива.
  72.      *
  73.      * @access public
  74.      * @param mixed
  75.      * @return object
  76.      */
  77.     public function append($value)
  78.     {
  79.         array_push($this->data, self::array2cover($value));
  80.  
  81.         return $this;
  82.     }
  83.  
  84.     /**
  85.      * Возвращает данные объекта как массив.
  86.      *
  87.      * @access public
  88.      * @param void
  89.      * @return array
  90.      */
  91.     public function getDataAsArray()
  92.     {
  93.         return self::object2array($this->data);
  94.     }
  95.  
  96.     /**
  97.      * Реализация метода интерфейса ArrayAccess.
  98.      *
  99.      * @param int|string|null $key ключ элемента
  100.      * @param mixed $value значение элемента
  101.      * @return Cover_Array
  102.      */
  103.     public function offsetSet($key, $value)
  104.     {
  105.         // Это присвоение нового элемента массиву типа $var[] = 'element';
  106.         if ($key === null)
  107.         {
  108.             $u = &$this->data[];
  109.         }
  110.         else
  111.         {
  112.             $u = &$this->data[$key];
  113.         }
  114.  
  115.         $u = self::array2cover($value);
  116.     }
  117.  
  118.     /**
  119.      * Реализация метода интерфейса ArrayAccess.
  120.      *
  121.      * @param int|string ключ элемента
  122.      * @return boolean
  123.      */
  124.     public function offsetExists($key)
  125.     {
  126.         return isset($this->data[$key]);
  127.     }
  128.  
  129.     /**
  130.      * Реализация метода интерфейса ArrayAccess.
  131.      *
  132.      * @param int|string ключ элемента
  133.      * @return void
  134.      */
  135.     public function offsetUnset($key)
  136.     {
  137.         if (isset($this->data[$key]))
  138.         {
  139.             unset($this->data[$key]);
  140.         }
  141.     }
  142.  
  143.     /**
  144.      * Реализация метода интерфейса ArrayAccess.
  145.      * Отличается от поведения ArrayObject тем, что в случае отсутствия
  146.      * запрошеного элемента не генерирует ошибку, а создает в вызвавшем
  147.      * его объекте, в хранилище, свойство $key содержащее пустой объект
  148.      * текущего класса.
  149.      *
  150.      * @param int|string ключ элемента
  151.      * @return mixed
  152.      */
  153.     public function offsetGet($key)
  154.     {
  155.         if (isset($this->data[$key]))
  156.         {
  157.             return $this->data[$key];
  158.         }
  159.         else
  160.         {
  161.             return $this->data[$key] = new Cover_Array();
  162.         }
  163.     }
  164.  
  165.     /**
  166.      * Преобразует все значения массива $in в массивы, если значения
  167.      * каких-либо элементов данных будут объекты типа Cover_Array.
  168.      *
  169.      * @access protected
  170.      * @param array
  171.      * @return array
  172.      */
  173.     protected static function object2array(array $in)
  174.     {
  175.         foreach ($in as $key => $value)
  176.         {
  177.             $in[$key] = (is_object($value) && $value instanceof self)
  178.                         ? $in[$key] = self::object2array($value->getData())
  179.                         : $value;
  180.         }
  181.  
  182.         return $in;
  183.     }
  184.  
  185.     /**
  186.      * Возвращает объект Cover_Array, если переданным
  187.      * в метод значением является массив.
  188.      *
  189.      * @access protected
  190.      * @param mixed
  191.      * @return mixed
  192.      */
  193.     protected static function array2cover($value)
  194.     {
  195.         return is_array($value) ? new Cover_Array($value) : $value;
  196.     }
  197. }
  198. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement