2012-07-07 7 views
5

Sto cercando di capire che cosa getIterator() è, spiegherò:ArrayObject, getIterator();

Come so getIterator è un metodo che noi chiamiamo di includere un iteratore esterna.

Il problema è getIterator includono è propri metodi si chiude pensa sembra la stessa è l'interfaccia Iterator, ma non può essere l'interfaccia può essere di classe, ma sto cercando di cercare all'interno del codice sorgente e SPL.php non ho trovato nulla, forse lo sto rendendo più complicato di quanto lo sia davvero, sarò felice se qualcuno mi può aiutare a capire dove si trova il codice sorgente SPL.php e cosa è (classe, ecc.). Grazie a tutti e buona giornata.

+0

** SPL ** non è né una classe né un'interfaccia. È una collezione di interfacce e classi così brevi che è una specie di libreria. [PHP SPL] (http://www.php.net/manual/en/intro.spl.php). Anche 'getIterator()' NON è una funzione o un metodo interno di 'PHP'. Stai usando una libreria esterna? –

+0

L'OP @ciriusrob si riferisce a 'IteratorAggregate :: getIterator()' – Gordon

+0

Grazie a @Gordon. Ho pensato che stesse chiamando 'getIterator()' da solo ma non sull'interfaccia 'IteratorAggregate'. Grazie per il consiglio. –

risposta

12

ArrayObject strumenti IteratorAggregate che consente di restituire un iteratore anziché implementarlo. È piuttosto semplice. Si supponga di avere una classe avvolgendo una matrice, come

class Foo 
{ 
    private $array = [1,2,3,4]; 
} 

e si desidera foreach su un'istanza di Foo, in questo modo:

foreach (new Foo as $bar) { 
    echo $bar; // outputs 1234 
} 

per raggiungere questo si potrebbe aggiungere l'interfaccia Iterator ma poi Dovevo implementare tutti i metodi nell'interfaccia per il semplice compito di iterare la matrice all'interno dell'oggetto. Non vuoi duplicare quel codice più e più volte ogni volta che hai bisogno di quella funzionalità, specialmente dal momento che esiste già un Iterator che fa ciò che vuoi. Così, invece di attuare Iterator di implementare IteratorAggregate

class Foo implements IteratorAggregate 
{ 
    private $array = [1,2,3,4]; 

    public function getIterator() 
    { 
     return new ArrayIterator($this->array); 
    } 
} 

Ora, quando si fa il foreach PHP utilizzerà l'Iterator tornato da getIterator invece dell'istanza Foo sé che consente di ottenere l'output 1234.

In caso di ArrayObject, il punto è semplicemente per consentire di foreach sui valori nello ArrayObject. Naturalmente, puoi anche chiamare lo getIterator da solo, poiché è pubblico e quindi utilizzare direttamente Iterator.

Da notare anche la firma di ctor ArrayObject:

public __construct (
    [ mixed $input 
    [, int $flags = 0 
    [, string $iterator_class = "ArrayIterator" 
]]]) 

quali note che Iterator verrà restituito.

+0

Sto leggendo ora Grazie Gordon. –

+0

Grazie Gordon, se ho avuto il tuo esempio giusto, il costruttore ArrayIterator definisce il nuovo array e quando eseguo il ciclo foreach il comportamento automatico incorporato utilizzando i metodi ArrayIterator (current(), key(), next()) per il ciclo di base foreach, il problema è che in questo caso sei stato tu a definire il metodo getIterator che utilizza i metodi ArrayIterator ma quando si esamina la classe ArrayObject c'è solo il metodo getIterator, ma non possiamo dare un'occhiata al contenuto di getIterator , il manuale php sta dicendo "Recupera un iteratore esterno" ma voglio vederlo, da dove viene questo iteratore esterno? –

+0

@uBlankText non è sicuro di cosa stai cercando, ma puoi controllare l'implementazione di ArrayObject :: getIterator qui: http://lxr.php.net/xref/PHP_5_4/ext/spl/spl_array.c#1277 – Gordon

Problemi correlati