Problemer med variabel scope i et objekt?
Hej med jer.Jeg har et php objekt der fungerer som node i et hierakisk træ. Hver node objekt har en firstChild, og en sibling
Hvis en node har flere children får jeg fat i dem gennem firstChild og dennes sibling (og igen dennes siblings sibling osv.)
Altså en kædet liste.
Mit objekt har en metode addChild(nyNode) som checker om noden allerede har unger. Har den ikke bliver nyNode sat som firstChild. Har den allerede en firstChild, så løber jeg firstChilds siblings igennem, og indsætter den nye child et sted i den kæde.
Mit problem er at jeg tilsyneladende godt kan indsætte firstChilds, men så snart jeg prøver at indsætte objekter i firstChilds siblings liste, så fungerer det indenfor metoden addChild (en testudskrift i slutningen af metoden tyder på at alt er korrekt) - men det "forsvinder" så snart jeg er ude af metoden.
Jeg går ud fra at det er et scope problem der gør at det objekt jeg henter som firstChild kommer til at være en lokal kopi der bliver smidt ud så snart metoden er overstået, uden at det får indflydelse på mit "globale" træ. Jeg kan bare ikke lige greje hvordan jeg får metoden til at arbejde på det rigtige træ istedet for en kopi (hvis det da er det der sker?).
Det virker list sært at skulle skrive global $firstChild, da det hele sker inde i kroppen på objektet (og derfor ifølge min regnebog burde være de rigtige objekter jeg har fat i?)
Er der nogen derude der kan hjælpe mig?
/o-zone
Her er lidt kode:
---8<----------
class Node{
var $sortOrder = 0;
var $name = '';
var $firstChild = null;
var $sibling = null;
function addChild($nyNode){
if ($this->firstChild == null){
// this is a virgin
$this->firstChild = $nyNode;
} else {
// node has children already
$oldSib = $this->firstChild;
$newSib = $oldSib->sibling;
while ((!is_null($newSib))&&($newSib->sortOrder < $nyNode->sortOrder)){
$oldSib = $newSib;
$newSib = $newSib->sibling;
}
$oldSib->sibling = $nyNode;
$nyNode->sibling = $newSib;
echo('Efter indsættelse bør det være: "'.$oldSib->name.'"-->"'.$nyNode->name.'"-->"'.$newSib.'"<br />');
echo('Efter indsættelse er det: "'.$oldSib->name.'"-->"'.$oldSib->sibling->name.'"-->"'.$oldSib->sibling->sibling.'"<br />');
}
---8<----------
