dedlfix: PHP4: $obj =& new Bla() vs. $obj = new Bla()

Beitrag lesen

echo $begrüßung;

Welche ist da zu bevorzugen? Ich denke mal die 1. oder?

Das kommt drauf an.

Die Syntax $obj =& new Foo; erzeugt eine Instanz der Klasse Foo, wobei eine Referenz auf das erzeugte Objekt in $obj abgelegt wird.

Die Syntax $obj = new Foo; erzeugt eine Instanz der Klasse Foo, wobei eine eine Kopie des erzeugten Objekts in $obj abgelegt wird. Die ursprünglich erzeugte Instanz ist damit nicht mehr erreichbar.

In "08/15-Scripts" spielt der Unterschied sicher keine Rolle.

Oder hat das irgendwelche Nachteile?

Du musst dir im Klaren sein, wann eine Kopie von Nachteil ist.

Beispiel:

class Foo {  
  
  var $foovar;  
  
  // constructor  
  function Foo(&$bar) {  
    $bar->something($this);  
  }  
}  
  
class Bar {  
  
  var $foo;  
  
  function something(&$foo) {  
    $this->foo =& $foo;  
  }  
}  
  
$bar = new Bar();  
$foo = new Foo($bar); // *1  
  
$foo->foovar = 42;  
echo $bar->foo;

Im Konstruktor von Foo wird eine Referenz auf die neu entstehende Foo-Instanz an eine Methode des per Referenz übergebenen Objekts $bar übergeben. in Bar::something() wird die übergebene Referenz in einer Eigenschaft festgehalten.
Von der neuen Foo-Instanz wird aber nur eine Kopie in $foo gespeichert. Eine Änderung von $foo->foovar beeinflusst $bar->foo nicht.
Ändert man die Zeile *1 zu $foo =& new Foo($bar); wird in $foo eine Referenz zu der Instanz abgelegt, die, durch dem Code im Konstruktor, auch in $bar bekannt ist. Änderungen in $foo sind damit auch in $bar->foo sichtbar.

Damit dürften alle Klarheiten beseitigt sein. :-)

Ab PHP5 gibt es diese Problematik so nicht mehr, da immer Referenzen übergeben werden und für eine Kopie explizit clone angegeben werden muss.

echo "$verabschiedung $name";