Jeg har et objekt af typen ClassA der bl.a. indeholder en variabel $this->childs af typen array. Jeg opretter flere instanser af ClassA og gemmer referencer dertil i $this->childs i de forskellige objekter. På den måde fås en hierarkisk struktur af objekter der hver især indeholder 1 til mange objekter af samme type.
Jeg har dog et problem med det array der holder de underordnede objekter. Når jeg vil skrive strukturen ud som HTML eksisterer array'et ($this->childs) ikke. Jeg har også fundet ud af, at hvis jeg instantierer flere objekter og tilføjer dem til det samme array. Så er array'et tomt hver eneste gang jeg tilføjer et nyt objekt.
Hej jakoba, jeg mener at have styr på det med referencerne: Hej regin, jeg har bygget videre på din kode, hvis du har mulighed for at afvikle min kode, så kan du se mit problem:
----kode--- <? class test { var $children; var $testID;
function test($testid) { $this->children = array(); $this->testID = $testid; }
function addchild($obj) { echo "Indsætter ".$obj->testID."<br>"; $this->children[] =& $obj; }
function getchildref($testid) { echo "Find ".$testid." i følgende array:<br>"; reset($this->children); print_r($this->children); echo "<br>"; for($i=0;$i<count($this->children);$i++) { $tmp =& $this->children[$i]; echo "Validerer på ".$tmp->testID."<br>"; if(strcmp($testid,$tmp->testID)==0) { echo "Har fundet ".$tmp->testID."<br>"; return $tmp; } else { echo "Ikke fundet - dykker rekursivt<br>"; $tmp->getchildref($testid); } next($this->children); } if($tmp->testID=="") { echo "Ikke fundet - returnerer rekursivt<br>"; } return $tmp; } }
$test = new test("mor"); echo "Moder-objektet er oprettet<br>"; $test1 = new test("barn1"); $test2 = new test("barn2"); $test->addchild($test1); $test->addchild($test2); echo "<br>";
$test3 = new test("barn3"); $test4 = new test("barn4"); $tmp =& $test->getchildref("barn2"); $tmp->addchild($test3); $tmp->addchild($test4); echo "Indeholder: ".count($tmp->children)."<br>";//Her findes objekterne. print_r($tmp->children); echo "<br><br>";
$test5 = new test("barn5"); $test6 = new test("barn6"); $tmp =& $test->getchildref("barn1"); $tmp->addchild($test5); $tmp->addchild($test6); echo "Indeholder: ".count($tmp->children)."<br>";//Her findes objekterne. print_r($tmp->children); echo "<br><br>TESTER OM BARN 1 OG 2 STADIG INDEHOLDER NOGLE BØRN (DET GØR DE IKKE!)<br>";
$tmp =& $test->getchildref("barn1"); echo "Indeholder: ".count($tmp->children)."<br>";//Her findes objekterne ikke mere. echo "<br>"; $tmp =& $test->getchildref("barn2"); echo "Indeholder: ".count($tmp->children)."<br>";//Her findes objekterne ikke mere. echo "<br>"; print_r($test->children); ?>
AHHH - Sorry GUYS!!! Jeg er stort set lige startet på PHP, og så gætter man sig til en masse uden af læse dokumentationen.
Som udgangspunkt regner jeg jo med at man kan opføre sig som i andre objektorienterede sprog, dog abstraherer man så fra det der med private, public, returtype angivelse m.m. som ikke findes i PHP.
MÆÆÆN! At man skal skrive et åndsvagt tegn som "&" foran metodenavnet på den metode der skal returnere en reference er da langt ude :-(. Men det har jeg nu gjort foran &getchildref($testid) og så virker det!
I får alligevel nogle points som tak for indsatsen.
VH Claus Schmidt
Synes godt om
Slettet bruger
24. april 2003 - 15:07#6
scmidt>>Det er løst i PHP 5.0 ... men der går nok et par måneder endnu før den kommer på gaden!
Nevermind.... tror jeg tænkte forkert... (doh!?) I PHP som det er nu: $object = new obj(); $object2 = $object; //To forskellige objekter.... I OOP: $object = new obj(); $object2 = $object; //samme object med to forskellige referencer.... Dette skulle gerne blive ændret i PHP 5.0 så det fungerer på den rigtige måde... private og public ved jeg ikke om det bliver løst... men ellers må man bare sørge for en ordentlig disciplin!
Ja "=" er en slags kopikonstruktør. Det er ok med mig, bare man er klar over det.
Du skal lige skrive en tekst som "svar" i stedet for "kommentar", hvis du vil have nogle points som tak for hjælpen.
Synes godt om
Slettet bruger
24. april 2003 - 15:19#11
ved ikke med jakoba... men for min skyld må du godt beholde dine pts...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.