Avatar billede schmidt Nybegynder
24. april 2003 - 00:39 Der er 11 kommentarer

Objekt der holder instanser af sin egen type.

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.

Min konstruktion kan vel lade sig gøre i PHP?
Avatar billede jakoba Nybegynder
24. april 2003 - 01:17 #1
Efter din beskrivelse burde det virke fint.

Har du check på sådan noget som at det at assigne et objekt til en variabel ikke laver en ny kopi af objektet, men blot giver en ny refence til det?

Pas også på når du unsetter en instans af et objekt. php's garbage collection er ikke specielt god, så du skal mestendels gøre det selv.

Men det er blot generelt bløp. For reel hjælp må du vise noget kode så vi ved hvad vi snakker om.
Avatar billede Slettet bruger
24. april 2003 - 01:21 #2
Går udfra du gør noget i stil med det her: (som virker fint)
<?php
class test
{
    var $children;
   
    function test()
    {
        $this->children = array();
    }
   
    function addchild()
    {
        $this->children[] = new test();
    }
}
$test = new test();
$test->addchild();
$test->addchild();
print_r($test->children);
?>

Anyways... jeg tror problemet ligger i din kode...
Så der er nok ikke andet for end at søge efter problemet og finde ud af hvor det går galt!
Avatar billede jakoba Nybegynder
24. april 2003 - 01:22 #3
PS: variablen  $this  har kun mening når den benyttes inden i en funktion der er i en instans af et objekt.
Avatar billede schmidt Nybegynder
24. april 2003 - 14:50 #4
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);
?>
Avatar billede schmidt Nybegynder
24. april 2003 - 15:06 #5
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
Avatar billede 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!
Avatar billede schmidt Nybegynder
24. april 2003 - 15:08 #7
I skal bare lige komme med et svar før i kan få noget :-)
Avatar billede schmidt Nybegynder
24. april 2003 - 15:09 #8
Hvad er løst regin? Det med private, public m.m.?
Avatar billede Slettet bruger
24. april 2003 - 15:13 #9
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!
Avatar billede schmidt Nybegynder
24. april 2003 - 15:17 #10
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.
Avatar billede Slettet bruger
24. april 2003 - 15:19 #11
ved ikke med jakoba... men for min skyld må du godt beholde dine pts...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester