Разница между ArrayIterator, ArrayObject и Array в PHP

Может ли кто-нибудь четко объяснить фундаментальные различия между 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. Так вот что такое Итератор, это нечто вроде оболочки вокруг массивов, чтобы обеспечить что-то называемое инкапсуляцией.

Может быть, вы найдете здесь свой ответ:

  • Класс ArrayIterator

Этот итератор позволяет отменить и изменить значения и ключи при повторении массивов и объектов.

Если вы хотите многократно перебирать один и тот же массив, вам необходимо создать экземпляр ArrayObject и создать его экземпляры ArrayIterator, ссылающиеся на него либо с помощью foreach, либо путем вызова метода getIterator () вручную.

Также читайте:

  • Класс ArrayObject
  • Массивы

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, за исключением ваших определенных коллекций, которые вам нужно определить для ваших собственных итераторов.