Objekte werden per Referenz übergeben – oder?

Beim Durchstöbern von Rudi’s PHP Labor bin ich auf diesen interessanten Artikel gestoßen, den ich hier gern nochmal aufwärmen möchte.

Etwas Code zum warmwerden:

<?php function modify(StdClass $t) { 	$t->foo = 321; }  $instance = new StdClass; $instance->foo = 123; modify($instance); print $instance->foo; 

Und, was kommt raus? Richtig! 321! Schließlich wird eine Referenz des Objekts übergeben. Wenn ich nun aber in der modify-Funktion die Variable, überschreibe…

<?php function modify(StdClass $t) { 	$t = new StdClass; 	$t->foo = 321; }  $instance = new StdClass; $instance->foo = 123; modify($instance); print $instance->foo; 

… lautet das Ergebnis auf einmal 123! Also doch nicht ganz so referenzig. Das gewünschte (?) Verhalten lässt sich aber doch noch erzwingen. Indem man eine „echte“ Referenz draus macht (einziger Unterschied zum letzten Codeblock ist das & im Funktionsparameter):

function modify(StdClass &$t) { 	$t = new StdClass; 	$t->foo = 321; }  $instance = new StdClass; $instance->foo = 123; modify($instance); print $instance->foo; 

Und voilà: 321!


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0