Das Zurückgeben von Ergebnissen per Referenz aus Funktionen heraus kann manchmal recht nützlich sein, um herauszufinden, an welche Variable eine Referenz gebunden werden soll. Man sollte diese Funktionalität nicht aus Performancegründen benutzen, der Kern ist intelligent genug, um dies selbst zu optimieren. Man sollte Referenzen nur dann zurückgeben, wenn man sinnvolle technische Gründe hat. Hierbei ist folgende Syntax zu verwenden:
<?php
class foo {
public $value = 42;
public function &getValue() {
return $this->value;
}
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue ist eine Referenz auf $obj->value, mit dem Wert 42.
$obj->value = 2;
echo $myValue; // Zeigt den neuen Wert von $obj->value, also 2.
?>
Hinweis: Im Gegensatz zur Parameterübergabe per Referenz ist bei der Rückgabe mittels Referenz an beiden Stellen die Angabe des & notwendig. Dies zeigt an, dass Sie eine Referenz und nicht wie gewöhnlich eine Kopie zurückgeben. Ebenfalls wird angezeit, dass für $myValue im Gegensatz zur normalen Zuweisung eine Referenzbindung durchgeführt wird.
Hinweis: Wenn man versucht, eine Referenz aus einer Funktion mit der Syntax return ($this->value); zurückzugeben, wird das nicht funktionieren, weil man versucht, das Ergebnis eines Ausdrucks zurückzugeben und nicht eine Variable per Referenz. Man kann nur Variablen per Referenz aus einer Funktion zurückgeben - sonst nichts. Seit PHP 5.1.0 wird ein
E_NOTICE
-Fehler erzeugt, wenn versucht wird, einen dynamischen Ausdruck oder das Ergebnis eines new-Operators zurückzugeben.
Um die zurückgegebene Referenz zu verwenden, muss Referenzzuweisung benutzt werden:
<?php
function &collector() {
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
<?php
function &collector() {
static $collection = array();
return $collection;
}
array_push(collector(), 'foo');
?>
Hinweis: Es ist zu beachten, dass array_push(&collector(), 'foo'); nicht möglich ist; es erzeugt einen fatalen Fehler.