PHP Missverständnis #1: Objekte werden per Referenz übergeben

Tags:

Hört man oft, stimmt so aber nicht: In PHP werden Objekte nicht per Referenz übergeben.

Was ist eine Referenz? Eine Referenz ist, wenn zwei Bezeichner (oder Variablennamen) auf den selben Daten-Container zeigen.

$a = 'foo';
$b = 'bar';
// +---+-------+
// | a | 'foo' |
// +---+-------+
// | b | 'bar' |
// +---+-------+

$a = 'foo';
$b = &$a;
// +---+-------+
// | a | 'foo' |
// | b |       |
// +---+-------+

Wenn wir in PHP ein Objekt erstellen, wird in der Variable nicht das Objekt, sondern ein Verweis auf das Objekt gespeichert.

$a = new stdClass;
$b = new stdClass;
// +---+-----------------------------+
// | a | <Verweis auf Objekt #10000> |
// +---+-----------------------------+
// | b | <Verweis auf Objekt #10001> |
// +---+-----------------------------+

Wenn wir diese Variable danach in unserem Code umherschieben (z.B. an eine Funktion übergeben), wird folglich auch nicht das Objekt an sich, sondern der Verweis darauf, übergeben. Und solange wir die Variable nicht explizit als Referenz übergeben, wird der Verweis - wie skalare Variablen auch - kopiert.

$a = new stdClass;
$b = $a;
// +---+-----------------------------+
// | a | <Verweis auf Objekt #10000> |
// +---+-----------------------------+
// | b | <Verweis auf Objekt #10000> |
// +---+-----------------------------+

$a = new stdClass;
$b = &$a;
// +---+-----------------------------+
// | a | <Verweis auf Objekt #10000> |
// | b |                             |
// +---+-----------------------------+

Oder als Code-Beispiel:

function byValue($b) {
    $b = new stdClass();
    $b->name = 'Fritz';
}

function byRef(&$b) {
    $b = new stdClass();
    $b->name = 'Fritz';
}

$a = new stdClass;
$a->name = 'Phil';

byValue($a);
echo $a->name; // Phil

byRef($a);
echo $a->name; // Fritz

Solange man keine obskuren Dinge programmiert, dürfte dieser Unterschied aber egal sein. Referenzen von Objekten sind eh böse; da kommt der Garbage Collector ziemlich ins Schnaufen. ;-)

Anmerkung: Ich habe mich gerade gefragt, was die korrekte Übersetzung von pass BY reference ist?! Per Referenz? Als Referenz? Durch Referenz? :S

Ähnliche Artikel

Kommentare