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.

Köszönet az ihletért az IBM cikkének. (Via Weblabor.)

++++-

Hozzászólások Hozzászólások RSS

  1. Ó, 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é... :)

Szólj hozzá!

regisztráció, bejelentkezés

Az oldalon nem jelenik meg.

Ezeket a tageket használhatod: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>