Interfata Iterator
<?php
Iterator extends Traversable {
abstract public mixed current()
abstract public scalar key()
abstract public void next()
abstract public void rewind()
abstract public boolean valid()
}
?>
Aceasta interfata este implementata in core-ul engine-ului Zend 2.0 si faciliteaza parcurgerea unor structuri de date complexe(cu proprietatea de a se parcurge intern). La prima vedere pare ceva foarte complicat, insa va puteti gandi ca orice poate fi parcurs in PHP folosind foreach, for, while, poate fi manipulat prin aceasta interfata: de la un simplu vector pana la row-urile rezultate dintr-un query SQL, continutul unui director sau liniile dintr-un fisier text.
Studiind interogarile din tabele MySQL, putem observa modul de parcurgere al rezultatului unui query:
<?php
$result = mysql_query("SELECT * FROM Utilizatori");
while ( $row = mysql_fetch_array($result) ) {
echo $row["Email"];
}
?>
Similar putem parcurge continutul unui director:
<?php
$dir = opendir('/director');
while ( $file = readdir($dir) ) {
}
?>
Iar pentru un fisier text:
<?php
$file = fopen("/director/fisier.txt", "r");
while (!feof($file)) {
$line = fgets($file);
}
?>
Puteti observa deja ca in linii mari este vorba de 2 operatii care se repeta, indiferent de tipul resursei manipulate:
- Initializarea
- Parcurgerea
Ne punem astfel urmatoarea intrebare: exista oare posibilitatea de a abstractiza aceste 2 operatii astfel incat indiferent de tipul de structura de data complexa, secventa de initializare-parcurgere sa fie absolut identica?
Haideti sa vedem mai intai ce metode avem la dispozitie in interfata Iterator:
- rewind()
Similar functiei reset() pentru vectori, aceasta metoda “deruleaza” iteratorul la primul element al structurii cu care se lucreaza.
- current()
Similar functiei current() pentru vectori, aceasta metoda intoarce elemental curent al structurii manipulate.
- key()
Similar functiei key() pentru vectori, aceasta metoda intoarce index-ul elementului curent al structurii manipulate.
- next()
Similar functiei next() pentru vectori, aceasta metoda “trece” la urmatorul element al structurii manipulate.
- valid()
Aceasta functie este utilizata dupa apelarea rewind() sau next() pentru a testa daca elementul curent al structurii exista. Cu alte cuvinte, metoda este folosita pentru a testa daca s-a ajuns la finalul structurii de date.
|