[PHP] Wanneer nu wel of geen &

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo, ik zit een beetje met vraagtekens in mijn hoofd.

Ik heb een hierarchische tree opgeslagen in een database en ben die nu aan het "terug" naar een object.
Simpel gezegt is het een Menu en Menu Item klasse die aangemaakt worden door een Data Access Object.

Het menu bevat alle menu items en een menu item heeft children en zowaar een parent.

Ik heb nu alleen een paar vraag tekens bij 2 functies, die vrijwel hetzelfde doen.
PHP:
1
2
3
4
5
6
    function addChild(&$child) {
        if (is_a($child, "MenuItem")) {
            $child->setParent($this);
            $this->children[] = $child; 
        }
    }

Dit is in MenuItem

PHP:
1
2
3
4
5
6
7
8
9
    function addItem(&$item) {
        if (is_a($item, "MenuItem")) {
            $this->items[$item->getIdentifier()] = $item;
            
            if (is_null($item->getParent())) {
                $this->root = &$item;   
            }
        }   
    }

Dit is in Menu

In beide gevallen wil ik het object bijhouden in ander object:
PHP:
1
2
3
4
5
$child->setParent($this);
$this->children[] = $child;

$this->items[$item->getIdentifier()] = $item;   
$this->root = &$item;


Ik zie nu net dat de "root" zetten nog anders is...

In alle gevallen wordt de methode aangeroepen met een &, dus
PHP:
1
2
$parent->addChild(&$item);
$menu->addItem(&$item);


Maar in de methode "moet" ik de & weg laten. Als ik die er wel neer zet, worde alle elementen in de array hetzelfde, als het laatste object.

Mijn ding werkt zo en als ik element los uit het Menu haal en verander, dan zijn ze in het menu ook veranderd.
PHP:
1
2
3
4
5
6
7
8
$item = &$menu->getItem(1);
print_r($item);
echo "\n\n";
$item->setTitle("blabla bla");

$item2 = &$menu->getItem(1);
print_r($item2);
echo "\n\n";

Dit werkt.

Kan iemand mij misschien vertellen waarom dit zo is. Alle informatie over refenenties binnen php is welkom!


Ik draai (op het moment) PHP Version 4.3.1

Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Dit heeft toch gewoon te maken met ByValue en ByReference? Zoek daar eens wat info over.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zend zegt (zeurt veel in mijn code over deprication)

Alle functie aanroepen "MOETEN", zonder &.
PHP:
1
2
3
4
5
function increment($n) {
 $n++;
}
$foo = 5;
increment(&$foo);

(dit is dus fout)

PHP:
1
2
3
4
5
function increment(&$n) {
 $n++;
}
$foo = 5;
increment($foo);

Zo moet het dus.

Maar wat doet mijn mengelmoes nu in het geheugen :S.

[ Voor 5% gewijzigd door Verwijderd op 16-07-2005 17:16 ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
In de PHP manual (as usual) staat er een leuk verhaaltje over references. In een ander topic van deze week zijn references ook aan bod gekomen. In een van de replies staat een korte samenvatting wanneer en hoe je nou die & moet toepassen.

Maar het blijft een geklungel met die dingen in PHP4, als je overstapt op PHP5 hoef je dit iig zelf niet meer te doen.

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 19:07

alienfruit

the alien you never expected

Ja, klopt... ik ben uiteindelijk maar overgestapt naar PHP5. Tijd die je aan dit soort verspeeld in PHP4 kost alleen maar geld. Maar goed in PHP5 werkt het allemaal prima, zijn we meteen van de references gezeik in het algemeen af. Wat is het toch fijn als je produkt alleen op je eigen server gehost wordt :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hoeveel werk is het om een redelijk grote web applicatie te "poorten" van php 4 naar php 5.

Als dit in het geheel mee valt, dan kan ik dat ook eens overwegen.

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 19:07

alienfruit

the alien you never expected

Nou ik had zelf alleen wat problemen met de template engine (nu nog yapter) en nog wat conflicten met reserved keywords etc. Maar verder werkt het allemaal gewoon prima nu.
Pagina: 1