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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
function modify(StdClass $t)
{
$t->foo = 321;
}
$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;
<?php function modify(StdClass $t) { $t->foo = 321; } $instance = new StdClass; $instance->foo = 123; modify($instance); print $instance->foo;
<?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…

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
function modify(StdClass $t)
{
$t = new StdClass;
$t->foo = 321;
}
$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;
<?php function modify(StdClass $t) { $t = new StdClass; $t->foo = 321; } $instance = new StdClass; $instance->foo = 123; modify($instance); print $instance->foo;
<?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):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function modify(StdClass &$t)
{
$t = new StdClass;
$t->foo = 321;
}
$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;
function modify(StdClass &$t) { $t = new StdClass; $t->foo = 321; } $instance = new StdClass; $instance->foo = 123; modify($instance); print $instance->foo;
function modify(StdClass &$t)
{
	$t = new StdClass;
	$t->foo = 321;
}

$instance = new StdClass;
$instance->foo = 123;
modify($instance);
print $instance->foo;

Und voilà: 321!

Weitere Posts:

Dieser Beitrag wurde unter php, Quicktips, webdev veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert