[PHP] Geheugen referenties

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Ik gebruik het volgende stukje code dat een directory uitleest:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    function readDir() {
        $dirHandle = openDir($this->directory);
        
        // construct the files tag 
        $filesNode = new XMLNode("files");
        
        while (false !== ($file = readdir($dirHandle))) {
            if (($file != "..") && ($file != ".")) {
                $fileNode = new XMLNode("file");
                $content = new XMLContentNode("filename",$file);
                $fileNode->appendChild($content);
                $filesNode->appendChild($fileNode);
            }
        }
        
        $this->XMLRoot->appendChild($filesNode);
        
        closedir($dirHandle);
    }


Omdat ik geen mogelijkheid heb om ingebouwde DOM function o.i.d. te gebruiken heb ik mijn eigen XML class geschreven. Die gebruik ik nu dus om een XML boom te bouwen en daar de info in te stoppen. Lukt allemaal aardig, alleen krijgt de ContentNode "file" iedere keer dezelfde content; te weten de filenaam van het laatste bestand dat uitgelezen wordt.

Ik schat dat dat te maken heeft met referenties / geheugenadressen, maar snap niet precies wat ik moet doen om het op te lossen. Ik voeg de nodes alsvolgt toe:

PHP:
1
2
3
4
5
6
    /* apppendChild adds a child node to this element */
    // takes a reference to $newChild because that could be altered later on
    function appendChild(&$newChild) {
//TODO: typecheck?
        $this->children[] = &$newChild;
    }


met de & om het geheugenadres op te slaan (referentie dus). Hier gaat het fout, aangezien die referentie steeds lijkt te wijzen naar hetzelfde adres, alsof de "new" operatie helemaal geen nieuwe instantie aanmaakt, maar de vorige gebruikt. Ik kan dat natuurlijk vies oplossen door alles in een array met een tellertje te stoppen, maar dat is eigenlijk niet de bedoeling.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik denk dat de 2de constructor parameter van XMLContentNode een referentie is. De waarde wordt dan constant de waarde die $file krijgt. Deze geef je iedere keer een nieuwe waarde waardoor je deze waarde overal ziet. Maak van die parameter dus een normale parameter en niet een reference.

Verder wordt van een object altijd een reference genomen als je deze als parameter meegeeft (php5 overigens, van 4 weet ik het niet zeker), dus dat expliciet aangeven is onnodig en kan problemen opleveren zo nu en dan. Gebruik ze gewoon niet als je niet zeker weet hoe het werkt. Je zult ze echt zeer zelden nodig hebben.

[ Voor 37% gewijzigd door Michali op 01-04-2005 18:36 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 19-09 08:48
Toch werkt het zonder niet goed! Het is eigenlijk de bedoeling dat het zowel in 4 en 5 werkt, maar mocht dt echt niet lukken kan ik altijd nog 2 versies maken.
Die 2e parameter is overigens geen reference, maar gewoon normaal. Zoals ik al zei; kan wel een oplossing bedenken, maar ik wil het graag met pointers doen om dat systeem ook eens lekker onder de knie te krijgen.

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Voeg eens na de
PHP:
1
$filesNode->appendChild($fileNode);
de volgende code toe:
PHP:
1
2
unset($fileNode);
unset($content);


Ik heb een dergelijk probleem ook gehad en dat op deze manier toen opgelost in php 4.