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

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?

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

  2. 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";