Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public function __construct()
{
$this->_position = 0;
}
public function rewind()
{
$this->_position = 0;
}public function __construct()
{
$this->rewind();
}
public function rewind()
{
$this->_position = 0;
}public function __construct($array = null)
{
if (!is_null($array)) {
$this->_container = $array;
}
}
protected container;
public function __construct()
{
$argv = func_get_args();
$argc = func_num_args();
if (argc == 0)
{
$this->container = array();
return;
}
if ( $argc == 1
AND is_array(argv[0]))
{
$this->container = argv[0];
}
else
{
$this->container = argv;
}
}// создадим контейнер из нескольких элементов
$arrayObject = new ArrayAccessable('a', 'b', 'c', 'd', 'e' => 'assoc');
// создадим контейнер из массива
$array = array('a', 'b', 'c', 'd', 'e' => 'assoc');
$arrayObject = new ArrayAccessable($array)Единственный недостаток заключается в том, что функции типа array_pop() не будут с ним работать.
/**
* Метод возвращает контейнер со списком всех ключей объекта
*
* @return Map Контейнер со списком ключей объекта
*/
public function get_keys()
{
return new self(array_keys($this->container));
}$tmp = $array();
array_pop($tmp);
$array($tmp);до $last = array_pop($array());это вызовет ошибку уровня E_STRICT. Данный подход, разумеется, имеет место, но методы-обертки позволяют использовать более короткий код $last = $array->pop(); и цепочки методов$set_fields = $query_params->get_keys->implode(' = ?, ') . ' =? ';. Кроме того, вы вольны сами выбирать интерфейс объекта, что позволяет избавиться от legacy-кода SPL (который очень хорошо заметен в функциях работы со строками), и избавляетесь от одного из параметров вызова, который необходимо передавать в функцию.$arrayObject = new ArrayAccessable('a', 'b', 'c', 'd', 'e' => 'assoc');var_dump('a' => 'b'); выдаетPHP Parse error: syntax error, unexpected T_DOUBLE_ARROW in Command line code on line 1
Parse error: syntax error, unexpected T_DOUBLE_ARROW in Command line code on line 1
$array = new ArrayAccessable('a', 'b', 'c', 'd', 'e');для многомерных $array = new ArrayAccessable(array('a', 'b', 'c', 'd', 'e' => 'assoc')); /**
* Метод возвращает первый элемент контейнера
*
* @return mixed|null Первый элемент контейнера. Если контейнер пуст - null
*/
public function get_first()
{
foreach($this as $value)
{
return $value;
}
}
/**
* Метод возвращает последний элемент контейнера
*
* @return mixed|null Последний элемент контейнера. Если контейнер пуст - null
*/
public function get_last()
{
if ($this->count() == 0)
{
return;
}
$iterator = $this->getIterator();
// перейдем к последнему элементу
$iterator->seek($this->count() - 1);
return $iterator->current();
}Замечу, что использование метода getArrayCopy() приводит к тормозам, в зависимости от размера контейнера.ArrayObject implements IteratorAggregate,...def Iterator():
for elem in ['item1', 'item2', 'item3']:
yield elemiterator=(elem for elem in ['item1', 'item2', 'item3'])class ArrayAccess(object):
def __getitem__(self, key):
return self.container[key]class ArrayAccess(object):
def __getitem__(self, key):
return self.container[key]
def __setitem__(self, key, value):
self.container[key]=value
def __delitem__(self, key, value):
del self.container[key]class Countable(object):
def __len__(self):
return len(self.container)
Iterator, ArrayAccess, Countable: Объект как массив