ArrayObject, гетИтератор();


Я пытаюсь понять, что getIterator() есть, я объясню:

Как я знаю, getIterator - это метод, который мы вызываем для включения внешнего итератора.

Проблема в том, что getIterator включает свои собственные методы закрывающий интерфейс выглядит так же, как интерфейс итератора, но это не может быть интерфейс, это может быть класс, но я пытаюсь найти его внутри SPL.php исходный код и не нашел ни одного, может быть, я делаю это сложнее, чем есть на самом деле, я буду счастлив, если кто-нибудь может помочь мне понять, где он находится в SPL.php исходный код и что это такое (класс и т.д.). Спасибо вам всем и хорошего вам дня.

Author: Junuxx, 2012-07-07

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" 
]]] )

Который отмечает, какой итератор будет возвращен.

 12
Author: Gordon, 2012-07-07 10:20:25