Der Grund, warum verschiedene Artikel unterschiedliche Dinge zu sagen scheinen, ist, dass sie über verschiedene Arten von Pass-by-Reference sprechen.
Die Hauptsache, die feststellt, ob ein Parameter mit Referenz übergeben werden sollte, ist die Funktionssignatur selbst, und die Grundlagen dieser dieser diese haben sich seit Php 4 nicht geändert. Betrachten Sie dieses Beispiel:
function foo( $by_value, &$by_reference ) { /* ... */ }
$a = 1; $b = 2;
foo( $a, $b );
Hier die äußere Variable $a
wird nach Wert an die Funktion übergeben, als ob sie als zugewiesen wird als $by_value = $a;
- Änderungen an $by_value
kann nicht beeinflussen $a
. Die Variable $b
wird jedoch bestanden durch Bezugnahme; Genau wie eine Aufgabe des Formulars $by_reference =& $b;
Dies bedeutet, dass eine Variable auf zwei Namen verwiesen wird, und jede Zuordnung zu einer wird als Zuordnung zu beiden fungiert.
Wenn Sie einen "gewöhnlichen" Wert (eine Zeichenfolge, Zahl oder ein Array) nach Wert bestehen, wird sein Wert nur in die neue Variable kopiert. Ab Php 5: Wenn Sie ein Objekt nach Wert bestehen, passiert etwas etwas anderes - der kopierte "Wert" ist nur ein Zeiger auf dasselbe Objekt. Das bedeutet, dass wenn $a
waren ein Objekt, man konnte anrufen $by_value->some_property = 42;
und $a->some_property
wäre auch 42
. Wenn Sie jedoch einen neuen Wert zugewiesen haben $by_value
, es würde immer noch nicht beeinflussen $a
.
Bis Php 5.4, da war ein extra Weg, um einen Parameter durch Bezugnahme zu übergeben, das das Referenzverhalten "erzwingen" sollte zur Anrufzeit. Dies bedeutete, dass Sie schreiben konnten foo(&$a, &$b);
und "erfassen" Änderungen an $by_value
im Inneren foo()
Funktion. Es war im Allgemeinen eine schlechte Idee, sich darauf zu verlassen, und es wurde so entfernt. (Es landete in 5,4, weil es zur Entfernung in Php 6 bestimmt war, dieses Projekt wurde jedoch auf unbestimmte Halt gebracht, wobei die kleineren Änderungen in 5,3 und 5,4 landen).
Schließlich können Funktionen Rückkehr eine Variable durch Referenz (als im Handbuch hier besprochen). Dies ist ein wenig fummelig &
in zwei Orte: Zu Beginn der Funktionserklärung, um das zu sagen return
Sollte "diese Variablenreferenz zurückgeben" nicht "diesen Wert zurückgeben"; und im Code, der es aufruft, um dieser Referenz eine Variable zuzuweisen, anstatt nur ihren Wert zu kopieren. Hier ist ein dummes Beispiel, das einen Referenzparameter mit einer Referenzrendite kombiniert (die beiden müssen nicht zusammengehen, es ist nur ein Beispiel):
function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable,
// but all those operations were by reference
Beachten Sie, dass viele Menschen fälschlicherweise glauben, dass die Übergabe einer Variablen durch Referenz einen Leistungsnutzen bietet, und dies war oft der einzige Grund für die Verwendung von Call-Time-Passing-für-Referenzen. Dies ist in der Regel falsch, da die Zend -Engine, die PHP versorgt Verweise. In der Tat, Referenzzuweisung im Allgemeinen Niederlagen Diese Optimierung aufgrund der Art und Weise, wie die Motors verfolgt, welche Variablen im Zustand des Kopierschreibens sind.