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:

<?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);

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

object(stdClass)[135]
object(stdClass)[135]
2

Wenn Objekte standardmäßig als Referenz übergeben würden, müsste hier der Typ der Variablen $a auch im globalen Geltungsbereich („Scope“) von Objekt zu Integer gewandelt werden. Dies ist jedoch nicht der Fall.

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

Es stimmt, 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.