[PHP] Reference probleem(pje)

Pagina: 1
Acties:

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Ik heb een object die een var bevat dat een reference is naar een ander object:

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...

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
<?
class Foo { 
   var $object; 

  function Foo($object) { 
      $this->object =$object; 
  } 
}
?> 


Zoiets, $object is een lokale variabele in de scope van Foo die vervolgens toegewezen wordt aan de globale $object van de class Foo .. bijvoorbeeld

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
class Foo { 
   var $object; 

  function Foo($object) { 
      $this->object =$object * 2 ; 
  } 
}


$x = new Foo;
$x->object = 5;
echo( "Waarde : " . $x->object . "<br>" );
$x->Foo( $x->object );
echo( "Nieuwe waarde : " . $x->object . "<br>" );
?>


Let wel op de Foo de constructor is voor de class Foo dwz deze wordt automatisch uitgevoerd als je een variabele van dat type aanmaakt.
Het kan dus ook zo :

PHP:
1
2
3
4
5
6
7
8
9
10
<?
class Foo { 
   var $object; 

  function Foo() { 
      $this->object = 5 ;// init globale var
      $this->object = $this->object * 2 ; 
  } 
}
?>

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Nee, want ik gebruik =& (let op de ampersand) in de ctor, dus daar kopieer ik wel degelijk een alias/reference. Het gaat echt pas fout op het "dubbele pijl" punt.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Ik had het probleem ook vorige week. 3 nachten mee lopen kloten en uiteindelijk een andere manier gebruikt, onder het mom van Keep It Simple & Ugly


global

[ Voor 0% gewijzigd door D2k op 30-08-2002 11:44 . Reden: O-) by D2k ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Ik heb het opgelost! :)

Het probleem zat toch niet waar ik dacht (dat kan werkt wel! sorry php...te snel geoordeeld), maar hier:

PHP:
1
$f = new Foo($o);


Daar moet een =& bij. Wat gebeurt er anders? Foo wordt netjes constructed met een alias naar $o, en dan na de "new" call wordt dit nieuwe object gekopieerd naar $f, inclusief al zijn members (!). Dus op dat moment werken we ook op een kopie van $o.

Werkt als een trein nu ;) Hoewel die niet zo vaak werken hmmm...

edit:

Mijn "omslachtige oplossing" is dus geen oplossing, en is nu ook niet meer nodig.