Tach!
Du kannst Werte übergeben, die unter anderem in Variablen abgelegt sein können, aber keine Variablen.
Darf ich das böse Wort call-by-reference zwischen die bröckeligen Fäkalien streuen?
Ja, aber auch dann übergibst du keine Variablen, sondern eine Referenz auf irgendwas.
$foo = einObjekt;
$bar = einObjekt;
$qux = $foo;
Natürlich ist der Sprachgebrauch üblich, dass man $foo ein Objekt zugewiesen hat. Das vereinfacht die Kommunikation. Aber im Hinterkopf sollte man wissen, dass es doch etwas anders abläuft. Man kommt nämlich ins Straucheln, wenn man die zweite und dritte Zeile erklären möchte. Ist in $bar nun eine Kopie? Ist $qux eine Kopie oder zeigt $qux auf $foo? Mitnichten. Stattdessen liegt das Objekt irgendwo im Speicher und alle drei Variable referenzieren in gleicher Weise auf es. Genauerweise müsste man so formulieren. $foo bekommt eine Referenz auf einObjekt zugewiesen, $bar ebenfalls, und $qux bekommt eine Kopie der in $foo enthaltenen Referenz.
Mit skalaren Werte wird intern auch nicht anders verfahren. Für einen Wert existiert ein Container (zval-Datenstruktur), in dem dieser nebst Metadaten (z.B. Typinformation) abgelegt ist. Eine Variable referenziert auf diesen Container. PHP arbeitet nach dem Prinzip copy-on-write. Wenn nun
$a = 42;
$b = a;
ausgeführt wird, existiert weiterhin nur ein Container, aber $a und $b verweisen auf diesen. Erst wenn sich $b ändert, wird eine Kopie des Containers erzeugt, mit dem dann weitergearbeitet wird. Bei
$a = 42;
$b &= a;
passiert auch nur ein ähnlicher Vorgang.
Literatur dazu im PHP-Handbuch (verlinkt):
- PHP at the Core
- debug_zval_dump() mit dem unter "See also" verlinkten Artikel "References Explained" von Derick Rethans.
dedlfix.