Egy másik gyakori kódtípus, ami nem ugyanúgy viselkedek a különböző verziókban:
class Category {
var $id;
var $parentId;
var $children;
function Category( $id, $parentId=0 ) {
$this->id = $id;
$this->parentId = $parentId;
}
}
$categories[1] = new Category( 1 );
$categories[2] = new Category( 2, 1 );
$categories[3] = new Category( 3, 1 );
$categories[4] = new Category( 4, 2 );
$categories[5] = new Category( 5, 3 );
foreach ( $categories as $id=>$category ) {
// Az újabb verziók automatikusan referencia
// szerinti átadást használnak:
$categories[$category->parentId]->children[$id] = $categories[$id];
// A régebbiekben ezt nekünk kell kényszerítenünk:
$categories[$category->parentId]->children[$id] = &$categories[$id];
}
Pl. adatbázisból kapunk egy halom adatot, ahol a rekordok között szülő-gyermek( 1-n ) viszony van, és szeretnénk egy egyszerűen bejárható fát építeni belőlük minél kisebb költséggel. Erre a problémára adnak a referenciák egy lineáris időben futó, kis költségű lépésekből álló megoldást.
A PHP manualra jellemző, hogy a referenciák felhasználási területei közül pont egy olyat említ, amivel az objektum metódusainak megkerülésével nyúlhatunk hozzá egy taghoz. Rossz szokás, ami az esetek 95%-ában csak ront a kódon:
class foo {
public $value = 42;
public function &getValue() {
return $this->value;
}
}
$obj = new foo;
// $myValue is a reference to $obj->value, which is 42:
$myValue = &$obj->getValue();
$obj->value = 2;
// prints the new value of $obj->value, i.e. 2.
echo $myValue;
Az igazi szépsége a dolognak, hogy private tagokhoz is hozzá lehet férni ezzel a módszerrel :)
B.J.
Nincsenek megjegyzések:
Megjegyzés küldése