Objekte in PHP werden standardmäßig nicht als Referenz übergeben

Ich habe mehrfach gelesen, dass Objekte in PHP standardmäßig per Referenz (an eine Funktion) übergeben würden.

Obwohl das auf den ersten Blick so zu sein scheint, stimmt das nicht. Dies zeigt das folgende Code-Beispiel. Wenn Objekte standardmäßig als Referenz übergeben würden, müsste hier der Typ der Variablen $a von Objekt zu Integer gewandelt werden. Dies ist jedoch nicht der Fall.

<?php
function setVariableToIntegerValue($var) {
    $var = 2;
}

$a = new stdClass;
var_dump($a);

setVariableToIntegerValue($a);
var_dump($a);

function setVariableCalledByReferenceToIntegerValue(&$var) {
    $var = 2;
}

setVariableCalledByReferenceToIntegerValue($a);
var_dump($a);

Was wird dann übergeben? Objekte sind doch Variablen eines bestimmten Typs und eine „Objektvariable“ wird übergeben. Wenn die Variable nicht eine Referenz auf das Objekt enthält, was enthält sie dann? Den Wert des Objekts?

Richtig ist, dass standardmäßig bei der Übergabe einer Variablen an eine Funktion immer der Wert einer Variablen übergeben wird („pass by value“). Das ist auch bei Objekten so. Allerdings wird in der Objektvariablen nicht der Wert des Objekts gespeichert (was sollte das sein?), sondern ein Objektbezeichner (object identifier, pointer), der die Speicheradresse „enthält“, unter der das Objekt gespeichert ist.

Wo ist denn da der Unterschied zur Referenz?

Eine Referenz in PHP ist ein Alias, der es ermöglicht, dass zwei unterschiedliche Variablen sich auf denselben Wert beziehen.
Referenz: ($a, $b = 3.) Wird $a ein andere Wert zugeordnet, ist auch $b ein anderer Wert zugeordnet.
Objektbezeichner: ($a = $b = 3 => $a =3 und $b =3) Wird $a ein anderer Wert zugeordnet, ist $b kein anderer Wert zugeordnet.

Stefan Göbel

Webentwickler, Jurist, Triathlet und überzeugter Bonner.

Schreibe einen Kommentar

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