Es ist ja mittlerweile bekannt, dass Objekte ab PHP5 als Referenz an Methoden und Funktionen übergeben werden. Was ich aber heute feststellen musste: Dies ist so nicht ganz richtig! Es wird nämlich wie in Java verfahren und es wird eine Kopie der Referenz auf das Objekt als Parameter übergeben! (siehe dieser Beitrag bei stackoverflow.com)

Was bedeutet das genau?
Wenn ein Objekt an eine Funktion übergeben wird und dann eine Methode dieses Objektes aufgerufen wird, welche das Objekt verändert, so ist auch das ursprüngliche Objekt verändert:
/* modifizierende Funktion */
function addString(ArrayObject $a, $string){
$a->append($string);
}
$x = new ArrayObject();
addString($x, "hello");
echo $x->count(); //1

Bis dahin ist (mir) alles klar (gewesen).
Wenn in der Funktion aber das Objekt überschrieben und dann verändert wird, ändert sich das ursprüngliche Objekt nicht!
/* modifizierende Funktion */
function addString(ArrayObject $a, $string){
$a = new ArrayObject();
$a->append($string);
}
$x = new ArrayObject();
addString($x, "hello");
echo $x->count(); //0

Letztere Funktion würde das Objekt nur dann verändern, wenn man den bekannten „Reference Operator“ & verwendet (nennt man den so?):
/* modifizierende Funktion */
function addString(ArrayObject &$a, $string){
$a = new ArrayObject();
$a->append($string);
}
$x = new ArrayObject();
addString($x, "hello");
echo $x->count(); //1

Was lernen wir daraus? =) Wird ein Objekt als Funktions Parameter übergeben, wird in Wirklichkeit eine Kopie der Referenz übergeben. Überschreibt man diese Referenz, wird nicht das Objekt selbst überschrieben.

Übrigens: In Java kenne ich keine Möglichkeit, ein Objekt als „echte“ Referenz zu übergeben. In der Hinsicht ist PHP also ein kleines bisschen überlegen! *gg*

An dieser Stelle möchte ich übrigens auf stackoverflow.com hinweisen. Eine super Community, in der Fragen rund um die Computerwelt super beantwortet werden. (Man kann natürlich auch selbst Fragen beantworten) Das Frage-Antwort System ist dabei etwas ausgeklügelter als in einem „normalen“ Forum.
Auf jeden Fall empfehlenswert!

Advertisements