Objektum-iteráció PHP4 alatt is
Objektum-iteráció PHP4 alatt is
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.