PHP4: $obj =& new Bla() vs. $obj = new Bla()
Peter
- php
0 Fabian St.2 dedlfix
Hallo,
um Objekte zu erstellen gibts in PHP4 ja die 2 obigen Möglichkeiten.
Welche ist da zu bevorzugen? Ich denke mal die 1. oder? Oder hat das irgendwelche Nachteile?
Hi!
um Objekte zu erstellen gibts in PHP4 ja die 2 obigen Möglichkeiten.
Welche ist da zu bevorzugen? Ich denke mal die 1. oder? Oder hat das irgendwelche Nachteile?
Man kann hier nicht sagen, dass eine Möglichkeit Nachteile hätte - es kommt darauf an, was du erreichen möchtest. Beim ersten Beispiel wird ein Objekt eben per Referenz übergeben (bei PHP5 Standard), beim zweiten eben nicht.
Grüße,
Fabian St.
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";