Standard PHP Library (SPL) – rozhraní Iterator
- 1. Prosinec 2007
- Publikováno v PHP
- Napište komentář
Rozhraní Iterator slouží k procházení objektů pomocí konstrukce foreach. To znamená, že pokud objekt implementuje rozhraní Iterator, pak může být předán konstrukci foreach. Tímto způsobem je možné pracovat s objektem jako s polem (jen vzhledem ke konstrukci foreach) a skrýt tak jeho vnitřní implementaci.
Pro úplnost by mělo být řečeno, že aby foreach akceptoval objekt musí tento implementovat rozhraní Traversable. Avšak rozhraní Traversable neobsahuje definice žádných metod, tudíž je rozhodně vhodné vyhnout se jeho přímé implementaci. Radějí tedy implementujeme rozhraní Iterator, které od rozhraní Traversable dědí.
Rozhraní Iterator vypadá takto:
rewind()
nastaví iterátor na první prvek.
current()
vrací aktuální prvek.
key()
vrací aktuální klíč.
next()
nastaví iterátor na další prvek.
valid()
ověří zda aktuální prvek existuje.
Jak to celé funguje?
Volání
by se dalo přepsat takto
while ( $objekt->valid() ){
$index = $objekt->key();
$hodnota = $objekt->current();
echo "$index : $hodnota";
$objekt->next();
}
Jako příklad možného použití uvádím třídu Fibonacci, kterou je možné použít ke generování Fibonacciho posloupnosti.
/**
* Třída Fibonacci implementuje rozhraní Iterator
*/
class Fibonacci implements Iterator{
/**
* Kolik prvků posloupnosti třída obsahuje
*
* @var int
*/
private $kolik;
/**
* Hodnota prvního prvku posloupnosti
*
* @var int
*/
private $prvni;
/**
* Hodnota druhého prvku posloupnosti
*
* @var int
*/
private $druhy;
/**
* Hodnota n-1 prvku
*
* @var int
*/
private $nMinus1;
/**
* Hodnota n-2 prvku
* @var int
*/
private $nMinus2;
/**
* Ukazatel na aktuální prvek
*
* @var int
*/
private $citac;
* Konstruktor
*
* Pokud je zadán jen první parametr, bude se počítat klasická Fibonacciho posloupnost.
*
* @param int $kolik Kolik prvků posloupnosti se bude počítat
* @param int $prvni První prvek obecné Fibonacciho posloupnosti
* @param int $druhy Druhý prvek obecné Fibonacciho posloupnosti
*/
public function __construct($kolik, $prvni = 1, $druhy = 1){
$this->prvni = $prvni;
$this->druhy = $druhy;
$this->kolik = $kolik;
}
* Vrací aktuální prvek Fibonacciho posloupnosti
*
* @return int
*/
public function current(){
if ( $this->citac == 1 ) return $this->prvni;
if ( $this->citac == 2 ) return $this->druhy;
return $this->nMinus2 + $this->nMinus1;
}
* Vrací aktuální klíč (u posloupnosti tedy spíše pořadové číslo prvku)
*
* @return int
*/
public function key(){
return $this->citac;
}
* Inkrementuje vnitřní ukazatel (pořadové číslo prvku)
*
* @return null
*/
public function next(){
if ( $this->citac != 1 && $this->citac != 2 ){
$tmp = $this->nMinus1 + $this->nMinus2;
$this->nMinus2 = $this->nMinus1;
$this->nMinus1 = $tmp;
}
$this->citac++;
}
* Inicializuje Fibonacciho posloupnost
*
* @return null
*/
public function rewind(){
$this->citac = 1;
$this->nMinus2 = $this->prvni;
$this->nMinus1 = $this->druhy;
}
* Ověří zda je vnitřní čítač v mezích požadovaného rozsahu
*
* @return bool
*/
public function valid(){
return $this->citac <= $this->kolik;
}
}
$fib = new Fibonacci(10);
foreach ($fib AS $index => $hodnota){
echo "$index : $hodnota <br>";
}
//Vypíše 10 prvků obecné Fibonacciho posloupnosti, která má první prvek 10 a druhý prvek 2
$fib2 = new Fibonacci(10, 10, 2);
foreach ($fib2 AS $index => $hodnota){
echo "$index : $hodnota <br>";
}
Dosud žádný komentář.