Ik heb een object die een var bevat dat een reference is naar een ander object:
Nu heb ik een functie die een reference naar een object Foo vraagt, en dan een method op $object wil aanroepen.
Het probleem zit nu in de bar($f) call. Blijkbaar wordt er daar een kopie gemaakt van $object, die wordt veranderd door de someCall(), en dan bij functie exit wordt dit kopie weer fijn destroyed. Het resultaat is 0,0 mbt het $o object in de "main". Die blijft onveranderd.
Doe ik nou iets fout? Of php? Blijkbaar wordt er bij $Foo->object een tijdelijk kopie gemaakt.
Ik zie wel een oplossing, maar dat werkt zo omslachtig. Nl.:
Iemand een ander idee?
PHP:
1
2
3
4
5
6
7
| class Foo { var $object; function Foo(&$object) { $this->object =& $object; } } |
Nu heb ik een functie die een reference naar een object Foo vraagt, en dan een method op $object wil aanroepen.
PHP:
1
2
3
4
5
6
7
| function bar(&$Foo) { $Foo->object->someCall(); } $o = new Blah(); $f = new Foo($o); bar($f); |
Het probleem zit nu in de bar($f) call. Blijkbaar wordt er daar een kopie gemaakt van $object, die wordt veranderd door de someCall(), en dan bij functie exit wordt dit kopie weer fijn destroyed. Het resultaat is 0,0 mbt het $o object in de "main". Die blijft onveranderd.
Doe ik nou iets fout? Of php? Blijkbaar wordt er bij $Foo->object een tijdelijk kopie gemaakt.
Ik zie wel een oplossing, maar dat werkt zo omslachtig. Nl.:
PHP:
1
2
3
4
5
6
7
8
9
10
| //in Foo toevoegen: function &getObject() { return $this->object; } function bar(&$Foo) { $objref =& $Foo->getObject(); $objref->someCall(); } |
Iemand een ander idee?
edit:
Hmm ik zie het eigenlijk al, PHP voert dit uit: (($Foo->object) -> someCall()). Dus wordt eerst object opgehaald als temporary, en een ref (alias) gedraagt zich niet als pointer, dus het blijft geen ref maar wordt een echt kopie... Wel verwarrend
En onhandig...
Hmm ik zie het eigenlijk al, PHP voert dit uit: (($Foo->object) -> someCall()). Dus wordt eerst object opgehaald als temporary, en een ref (alias) gedraagt zich niet als pointer, dus het blijft geen ref maar wordt een echt kopie... Wel verwarrend