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.
** 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? –
L'OP @ciriusrob si riferisce a 'IteratorAggregate :: getIterator()' – Gordon
Grazie a @Gordon. Ho pensato che stesse chiamando 'getIterator()' da solo ma non sull'interfaccia 'IteratorAggregate'. Grazie per il consiglio. –