Nomármost: a PHP5 egyik hasznos újítása az, hogy az Iterator interfészen keresztül minden objektum (osztálypéldány) használható tömbként is – ennek leginkább a foreach ciklus alkalmazása során láthatjuk hasznát. Például így:
class TestClass { private $data = array('egy' => 'alma', 'kettő' => 'körte', 'három' => 'szőlő', 'négy' => 'barack'); // Az Iterator interfész implementációja public function rewind() { reset($this->data); } public function current() { return current($this->data); } public function key() { return key($this->data); } public function next() { return next($this->data); } public function valid() { return ( $this->current() !== false ); } } $instance = new TestClass; // És itt jön a trükk foreach($instance as $key => $value) { echo "$key => $value\n"; }...És a kimenet pedig várhatóan az lesz, hogy:
egy => alma kettő => körte három => szőlő négy => barack
Viszont nem kerül túl sok munkába írni egy függvényt, ami a Zend2-motor helyett a régi változatban (tehát a PHP4-ben) is elvégzi a tömbbé alakítás feladatát, valahogy így:
function ObjectIterator(&$object) { $retval = array(); $object->rewind(); do { $retval[$object->key()] = $object->current(); } while($object->next()); return $retval; }
Tehát az ObjectIterator függvénynek egy olyan osztály egy példányát kell átadni, ami "implementálja" az Iterator interfészt. (Idézőjelbe tettem az implementálni igét, lévén hogy PHP4-ben még nem létezik az implements kulcsszó.) A technika gyakorlatban így hasznosítható:
class TestClass { var $data = array('egy' => 'alma', 'kettő' => 'körte', 'három' => 'szőlő', 'négy' => 'barack'); function rewind() { reset($this->data); } function current() { return current($this->data); } function key() { return key($this->data); } function next() { return next($this->data); } function valid() { return ( $this->current() !== false ); } } function ObjectIterator(&$object) { $retval = array(); $object->rewind(); do { $retval[$object->key()] = $object->current(); } while($item = $object->next()); return $retval; } $instance = new TestClass; foreach(ObjectIterator($instance) as $key => $value) { echo "$key => $value\n"; }
Tehát mielőtt az objektumot a foreach-be dobnánk, köré rakjuk az ObjectIterator függvényt, ami elvégzi a piszkos munkát. Ugyan gyorsaság szempontjából úgy sejtem, hogy ez a megoldás nem teljesítene jól, mégis több mint a semmi: egy olyan hasznos technikát ad a programozó kezébe, amit az joggal hiányolhat a PHP4-ből.


Ó, azok a gyönyörű, iterator-okkal tűzdelt koratavaszi hajnalok, amikor a C++ tudásom halkan kezdte bontogatni szárnyait és csak lopva kacsintgatott az STD névtér felé... :)