ArrayObject
implementa IteratorAggregate
que le permite devolver un iterador en lugar de implementarlo. Es bastante sencillo. Suponga que tiene una clase envolver una matriz, como
class Foo
{
private $array = [1,2,3,4];
}
y desea foreach
más de una instancia de Foo
, así:
foreach (new Foo as $bar) {
echo $bar; // outputs 1234
}
Para lograr que se podría añadir la interfaz Iterator
pero luego Había tenido que implementar todos los métodos en la interfaz para la tarea simple de iterar la matriz dentro del objeto. No desea duplicar ese código una y otra vez cuando necesite esa funcionalidad, especialmente porque ya hay un iterador que hace lo que desea. Así que en lugar de implementar Iterator
implementar IteratorAggregate
class Foo implements IteratorAggregate
{
private $array = [1,2,3,4];
public function getIterator()
{
return new ArrayIterator($this->array);
}
}
Ahora cuando hace lo foreach
PHP usará el iterador regresó de getIterator
en lugar de la propia instancia Foo
que le permite obtener la salida 1234.
En caso de ArrayObject
, el punto es simplemente para permitirle foreach
sobre los valores en el ArrayObject
. Por supuesto, también puede llamar al getIterator
usted mismo, ya que es público y luego usar el iterador devuelto directamente.
También tenga en cuenta la firma de Héctor ArrayObject
:
public __construct (
[ mixed $input
[, int $flags = 0
[, string $iterator_class = "ArrayIterator"
]]])
la que señala el cual será devuelto iterador.
** SPL ** no es ni una clase ni una interfaz. Es una colección de interfaces y clases tan cortas que es una especie de biblioteca. [PHP SPL] (http://www.php.net/manual/en/intro.spl.php). Además 'getIterator()' NO es una función o método 'PHP' interno. ¿Estás usando una biblioteca externa? –
@ciriusrob OP se refiere a 'IteratorAggregate :: getIterator()' – Gordon
Gracias @Gordon. Pensé que estaba llamando 'getIterator()' por sí mismo, pero no en la interfaz 'IteratorAggregate'. Gracias por el consejo. –