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.

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

Hozzáfűznél valamit?

Dobj egy emailt a blog kukac deadlime pont hu címre.

Feliratkoznál?

Az RSS feed-et ajánljuk, ha kedveled a régi jó dolgokat.