1. Erläuterungen
Übergibt man eine Variable eines primitiven Datentyps (Boolean, Integer, Float, String, Array) an eine Funktion oder weist sie einer anderen Variable zu, dann wird standardmäßig in PHP nur der Wert (also der Inhalt) kopiert. Würde man nun an der neuen Variable Änderungen durchführen, bliebe der Wert der alten Variable unverändert. Will man stattdessen, dass auch die alte Variable mitgeändert wird, müssen Referenzen verwendet werden. Diese sind sozusagen Alternativnamen für die selbe Variable.
2. Beispiel: Eine einfache Referenz
Im nachfolgenden Beispiel wird zunächst dargestellt, wie sich Variablen ohne Referenz Verhalten (Abschnitt „ohne Referenz”). Anschließend wird das Verhalten mit Referenz gezeigt. Hier wird beispielhaft die Variable $a mit 1 initialisiert und $b als Referenz auf $a definiert. Jede Veränderung an $b hat nun auch Auswirkungen auf $a, was vorher nicht der Fall war.
<?php // ohne Referenz $a = 1; $b = $a; $b = $b + 100; echo("a: $a, b: $b \n"); // mit Referenz $a = 1; $b = &$a; $b = $b + 100; echo("a: $a, b: $b \n"); ?>
a: 1, b: 101 a: 101, b: 101
3. Beispiel: Referenz über mehrere Variablen hinweg
Referenzen können auch Auswirkungen über mehrere Variablen hinweg haben:
<?php $a = 1; $b = &$a; $c = &$b; $d = &$c; $e = &$d; $e = 'test'; echo("a: $a \n"); ?>
a: test
4. Beispiel: Referenz an Funktion übergeben
In diesem Beispiel wird eine Funktion definiert, welche eine Referenz als Variable entgegennimmt und diese Variable um eins erhöht. Obwohl das Ergebnis nicht per return zurückgegeben wird, enthält die Variable trotzdem nachher den um eins erhöhten Wert.
<?php function increase(&$var) { $var = $var + 1; } $a = 1; increase($a); echo($a); ?>
2
Gewöhnlich wird es bereits in der Definition der Funktion vorgeschrieben, ob die Parameter Referenzen sein sollen oder nicht. Man kann sich aber auch darüber hinwegsetzen und gezielt eine Referenz übergeben, obwohl dies eigentlich nicht vorgesehen ist. Dieses Verfahren ist allerdings veraltet und erzeugt daher bei Anwendung eine Deprecated-Warnung.
<?php function increase($var) { $var = $var + 1; } $a = 1; increase(&$a); echo($a); ?>
<br /> <b>Deprecated</b>: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of increase(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in <b>...\test.php</b> on line <b>7</b><br /> 2
5. Beispiel: Objekte werden standardmäßig als Referenz übergeben
Während primitive Datentypen standardmäßig kopiert werden, sind Variablen mit Objekten immer Referenzen. Man kann sie daher beliebig an Funktionen oder andere Variablen weitergeben und über diese verändern — Auswirkungen hat dies dann auf alle Variablen, denn intern zeigen diese letztlich auf das selbe Objekt und an diesem Objekt werden die Änderungen durchgeführt.
<?php class Example { public $a = 0; } function increase(Example $obj) { $obj->a = $obj->a + 1; } $example = new Example(); echo($example->a . "\n"); // $example an andere Funktion uebergeben und in dieser den Wert erhoehen increase($example); increase($example); increase($example); echo($example->a . "\n"); // $example an andere Variable uebergeben und ueber diese den Wert erhoehen $b = $example; $b->a = $b->a + 10; echo($example->a . "\n"); echo($b->a); ?>
0 3 13 13
6. Hinweis
Die Verwendung von Referenzen gilt als schlechter Stil und sollte möglichst vermieden werden. (Abgesehen, offensichtlich, von Objekten, bei denen Referenzen vorgeschrieben sind und automatisch verwendet werden.)