Übergabe per Referenz
Sie können eine Variable per Referenz an eine Funktion übergeben, sodass die Funktion den Wert ihres Parameters ändern kann. Die Syntax lautet wie folgt:
<?php function foo(&$var) { $var++; } $a=5; foo($a); // $a is 6 here ?>
Beachten Sie, dass es im Funktionsaufruf keine Referenzsymbole gibt – nur in der Funktionsdefinition. Die Funktionsdefinition allein reicht aus, damit Parameter korrekt per Referenz übergeben werden. Wenn Sie in neueren PHP-Versionen & in foo(&$a); verwenden, erhalten Sie eine Warnung, dass „Call-time pass-by-reference“ veraltet ist.
Folgendes kann als Referenz übergeben werden:
Variablen wie foo($a)
Neue Anweisungen wie foo(new foobar())
Von Funktionen zurückgegebene Referenzen, zum Beispiel:
<?php function &bar() { $a = 5; return $a; } foo(bar()); ?>
Andere Ausdrücke können nicht als Referenz übergeben werden und das Ergebnis ist undefiniert. Das folgende Beispiel für die Referenzübergabe ist beispielsweise ungültig:
<?php function bar() // Note the missing & { $a = 5; return $a; } foo(bar()); // 自 PHP 5.0.5 起导致致命错误 foo($a = 5) // 表达式,不是变量 foo(5) // 导致致命错误 ?>
Diese Bedingungen sind in PHP 4.0.4 und späteren Versionen verfügbar.
Referenzrückgabe
Referenzrückgabe wird verwendet, wenn Sie mithilfe einer Funktion herausfinden möchten, an welche Variable die Referenz gebunden werden soll. Verwenden Sie keine Rückgabereferenzen, um die Leistung zu steigern. Die Engine ist intelligent genug, um sie selbst zu optimieren. Geben Sie Referenzen nur zurück, wenn ein triftiger technischer Grund vorliegt! Um eine Referenz zurückzugeben, verwenden Sie diese Syntax:
<?php class foo { public $value = 42; public function &getValue() { return $this->value; } } $obj = new foo; $myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42. $obj->value = 2; echo $myValue; // prints the new value of $obj->value, i.e. 2. ?>
In diesem Beispiel werden den Eigenschaften des von der getValue-Funktion zurückgegebenen Objekts Werte zugewiesen und nicht kopiert, so als ob keine Referenzsyntax verwendet würde.
Hinweis: Anders als bei der Parameterübergabe muss hier das kaufmännische Und-Zeichen an beiden Stellen verwendet werden – was anzeigt, dass eine Referenz zurückgegeben wird, nicht die übliche Kopie, und auch anzeigt, dass $myValue als Referenz gebunden ist, statt wie üblich Abtretung.
Hinweis: Wenn Sie versuchen, eine Referenz von einer Funktion wie dieser zurückzugeben: return ($this->value);, funktioniert dies nicht, da Sie versuchen, das Ergebnis eines Ausdrucks und nicht eines zurückzugeben referenzierte Variable. Sie können Referenzvariablen nur von Funktionen zurückgeben, eine andere Möglichkeit gibt es nicht. Wenn Code versucht, einen dynamischen Ausdruck oder das Ergebnis des neuen Operators zurückzugeben, wird ab PHP 4.4.0 und PHP 5.1.0 ein E_NOTICE-Fehler ausgegeben.