Может ли кто-нибудь четко объяснить фундаментальные различия между ArrayIterator
, ArrayObject
и Array в PHP с точки зрения функциональности и работы? Благодаря!
Array
– это родной тип php. Вы можете создать его с помощью php language construct array()
или с php 5.4 и далее []
ArrayObject
– это object
который работает точно так же, как массивы. Они могут быть созданы с использованием new
ключевого слова
ArrayIterator
похож на ArrayObject
но он может выполнять итерацию. Также создается с использованием new
Сравнение Array
vs ( ArrayObject
/ ArrayIterator
)
Оба они могут использоваться с использованием синтаксиса массива php, например.
$array[] = 'foo'; $object[] = 'foo'; // adds new element with the expected numeric key $array['bar'] = 'foo'; $object['bar'] = 'foo'; // adds new element with the key "bar" foreach($array as $value); foreach($object as $value); // iterating over the elements
Тем не менее, они все еще являются объектами против массивов, поэтому вы заметили различия в
is_array($array); // true is_array($object); // false is_object($array); // false is_object($object); // true
Большинство функций массива php ожидают массивы, поэтому использование объектов там будет приводить к ошибкам. Таких функций много. Напр.
sort($array); // works as expected sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......
Наконец, объекты могут делать то, что вы ожидаете от объекта stdClass
, то есть доступ к общедоступным свойствам с использованием синтаксиса объекта
$object->foo = 'bar'; // works $array->foo = 'bar'; // Warning: Attempt to assign property of non-object in ....
Массивы (являющиеся родным типом) намного быстрее, чем объекты. С другой стороны, ArrayObject
& ArrayIterator
имеют определенные методы, которые вы можете использовать, в то время как таких массивов нет для массивов
Сравнение ArrayObject
vs ArrayIterator
Основное различие между этими 2 заключается в методах, которые имеют классы.
ArrayIterator
реализует интерфейс Iterator
который дает ему методы, связанные с итерацией / циклом над элементами. ArrayObject
имеет метод exchangeArray
который меняет свой внутренний массив на другой. Реализация подобной вещи в ArrayIterator
бы либо создание нового объекта, либо цикл через клавиши и все их по ArrayIterator
затем установку элементов из нового массива один за другим.
Затем, поскольку ArrayObject
не может быть повторен, когда вы используете его в foreach
он создает объект ArrayIterator
внутри (то же, что и массивы). Это означает, что php создает копию исходных данных, и теперь есть 2 объекта с одинаковым содержимым. Это окажется неэффективным для больших массивов. Тем не менее, вы можете указать, какой класс использовать для iterator, поэтому вы можете иметь пользовательские итераторы в своем коде.
Надеюсь, это полезно. Редактирование этого ответа приветствуется.
ArrayObject и массив несколько похожи. Просто коллекция объектов (или родных типов). У них есть несколько разных методов, которые вы можете назвать, но в основном это сводится к одному и тому же.
Однако Итератор – это нечто иное. Шаблон проектирования итератора – это способ защитить ваш массив (делая его доступным только для чтения). Давайте рассмотрим следующий пример:
У вас есть класс с массивом. Вы можете добавлять элементы в этот массив, используя addSomethingToMyArray. Обратите внимание, однако, что мы делаем что-то для элемента, прежде чем добавлять его в массив. Это может быть что угодно, но позволяет на мгновение действовать так, как очень важно, чтобы этот метод запускался для КАЖДОГО элемента, который мы хотим добавить в массив.
class A { private $myArray; public function returnMyArray() { return $this->myArray; } public function addSomethingToMyArray( $item ) { $this->doSomethingToItem( $item ); array_push( $item ); } }
Проблема с этим заключается в том, что вы передаете массив по ссылке здесь. Это означает, что классы, которые на самом деле используют returnMyArray, получают реальный объект myArray. Это означает, что классы, отличные от A, могут добавлять вещи к этому массиву, а также изменять массив внутри A без использования addSOmethingToMyArray. Но нам нужно было сделать что-то, помнишь? Это пример класса, который не контролирует свой собственный внутренний статус.
Решение этого – итератор. Вместо передачи массива мы передаем массив новому объекту, который может только ПРОЧИТАТЬ вещи из массива. Самый простой Итератор – это примерно так:
<?php class MyIterator{ private $array; private $index; public function __construct( $array ) { $this->array = $array; } public function hasNext() { return count( $this->array ) > $this->index; } public function next() { $item = $this->array[ $this->index ]; this->$index++; return $item; } }
?>
Как вы можете видеть, у меня нет способа добавления новых элементов в данный массив, но у меня есть возможности для чтения массива следующим образом:
while( $iterator->hasNext() ) $item = $iterator->next();
Теперь снова есть только один способ добавить элементы в myArray в A, а именно через метод addSomethingToArray. Так вот что такое Итератор, это нечто вроде оболочки вокруг массивов, чтобы обеспечить что-то называемое инкапсуляцией.
Может быть, вы найдете здесь свой ответ:
Этот итератор позволяет отменить и изменить значения и ключи при повторении массивов и объектов.
Если вы хотите многократно перебирать один и тот же массив, вам необходимо создать экземпляр ArrayObject и создать его экземпляры ArrayIterator, ссылающиеся на него либо с помощью foreach, либо путем вызова метода getIterator () вручную.
Также читайте:
array
– один из восьми примитивных типов в PHP. Несмотря на то, что он поставляется с множеством встроенных функций утилиты, но все они процедурные.
И ArrayObject
и ArrayIterator
позволяют нам создавать массивы первоклассных граждан в объектно-ориентированной программе (ООП).
Разница между ArrayObject
и ArrayIterator
заключается в том, что, поскольку ArrayIterator
реализует интерфейс SeekableIterator
, вы можете сделать $myArray->seek(10);
с ArrayIterator
.
Итератор – это объект, который позволяет программисту перемещаться по контейнеру, особенно списку. Различные типы итераторов часто предоставляются через интерфейс контейнера.
Нет большой разницы между ArrayObject
и Array
поскольку они представляют ArrayObject
и те же вещи, хотя и используют разные типы объектов.
ArrayIterator
– это итератор, который выполняет ArrayIterator
объектам Array-like
, включая все объекты, которые реализуют ArrayAcess
и собственный тип Array
. Фактически, когда вы foreach
через массив, PHP внутренне создает ArrayIterator
чтобы выполнить перемещение и преобразовать ваш код, чтобы выглядеть так, как будто набрал это,
for( $arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator- >next()) { $key = $arrayIteartor->key(); $value = $arrayIterator->current(); }
Таким образом, вы можете видеть, что каждый объект коллекции имеет Iterator, за исключением ваших определенных коллекций, которые вам нужно определить для ваших собственных итераторов.