2012-07-07 7 views
5

Estoy tratando de entender lo que getIterator() es decir, voy a explicar:ArrayObject, getIterator();

Como sé getIterator es un método que llamamos para incluir un iterador externa.

El problema es getIterator incluyen es métodos propios se cierra el piensa que se ve es la misma interfaz Iterator pero no puede ser una interfaz que puede ser de clases, sino que trato de buscarla en el código fuente y SPL.php no encontré ninguno, tal vez estoy haciendo esto más complicado de lo que realmente es, estaré feliz si alguien me puede ayudar a entender dónde está el código fuente de SPL.php y qué es (clase, etc.). Gracias a todos y que tengas un buen día.

+0

** 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? –

+0

@ciriusrob OP se refiere a 'IteratorAggregate :: getIterator()' – Gordon

+0

Gracias @Gordon. Pensé que estaba llamando 'getIterator()' por sí mismo, pero no en la interfaz 'IteratorAggregate'. Gracias por el consejo. –

Respuesta

12

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.

+0

Estoy leyendo ahora Gracias Gordon. –

+0

Gracias Gordon, si tengo el ejemplo correcto, el constructor de ArrayIterator define la nueva matriz y cuando se ejecuta el ciclo foreach el comportamiento auto incorporado usando métodos ArrayIterator (current(), key(), next()) para el ciclo foreach básico, el problema es que en este caso usted fue el que definió el método getIterator que usa los métodos ArrayIterator, pero cuando mira la clase ArrayObject solo existe el método getIterator, pero no podemos echarle un vistazo al contenido de getIterator , php manual dice "Recuperar un iterador externo" pero quiero verlo, ¿de dónde viene este iterador externo? –

+0

@uBlankText no está seguro de lo que está buscando, pero puede verificar la implementación de ArrayObject :: getIterator aquí: http://lxr.php.net/xref/PHP_5_4/ext/spl/spl_array.c#1277 – Gordon

Cuestiones relacionadas