ArrayObject, гетИтератор();
Я пытаюсь понять, что getIterator()
есть, я объясню:
Как я знаю, getIterator
- это метод, который мы вызываем для включения внешнего итератора.
Проблема в том, что getIterator включает свои собственные методы закрывающий интерфейс выглядит так же, как интерфейс итератора, но это не может быть интерфейс, это может быть класс, но я пытаюсь найти его внутри SPL.php исходный код и не нашел ни одного, может быть, я делаю это сложнее, чем есть на самом деле, я буду счастлив, если кто-нибудь может помочь мне понять, где он находится в SPL.php исходный код и что это такое (класс и т.д.). Спасибо вам всем и хорошего вам дня.
1 answers
ArrayObject
реализует IteratorAggregate
, который позволяет возвращать итератор вместо его реализации. Это довольно просто. Предположим, у вас есть класс, обертывающий массив, например
class Foo
{
private $array = [1,2,3,4];
}
И вы хотите foreach
над экземпляром Foo
, например:
foreach (new Foo as $bar) {
echo $bar; // outputs 1234
}
Для достижения этой цели вы могли бы добавить интерфейс Iterator
, но тогда вам пришлось бы реализовать все методы в интерфейсе для простой задачи повторения массива внутри объекта. Вы не хотите дублировать этот код снова и снова, когда вам нужна эта функциональность, тем более что уже есть итератор, который делает то, что вы хотите. Поэтому вместо реализации Iterator
вы реализуете IteratorAggregate
class Foo implements IteratorAggregate
{
private $array = [1,2,3,4];
public function getIterator()
{
return new ArrayIterator($this->array);
}
}
Теперь, когда вы выполняете foreach
, PHP будет использовать итератор, возвращенный из getIterator
вместо самого экземпляра Foo
, что позволит вам получить результат 1234.
В случае ArrayObject
смысл просто в том, чтобы позволить вам foreach
переопределить значения в ArrayObject
. Конечно, вы также можете позвонить getIterator
самостоятельно, так как он общедоступен, а затем напрямую используйте возвращаемый итератор.
Также обратите внимание на подпись ctor ArrayObject
:
public __construct (
[ mixed $input
[, int $flags = 0
[, string $iterator_class = "ArrayIterator"
]]] )
Который отмечает, какой итератор будет возвращен.