Suche…


Syntax

  • $foo = 1; $bar = &$foo; // both $foo and $bar point to the same value: 1
  • $var = 1; function calc(&$var) { $var *= 15; } calc($var); echo $var;

Bemerkungen

Beim Zuweisen von zwei Variablen nach Referenz zeigen beide Variablen auf denselben Wert. Nehmen Sie das folgende Beispiel:

$foo = 1;
$bar = &$foo;

$foo zeigt nicht auf $bar . $foo und $bar beide auf den gleichen Wert von $foo ( 1 . Um zu zeigen:

$baz = &$bar;
unset($bar);
$baz++;

Wenn wir eine Beziehung points to Beziehung hätten, wäre diese jetzt nach dem unset() gebrochen. stattdessen zeigen $foo und $baz immer noch auf den gleichen Wert, nämlich 2 .

Nach Referenz zuweisen

Dies ist die erste Phase der Referenzierung. Wenn Sie nach Referenz zuweisen , lassen Sie zu, dass zwei Variablen denselben Wert als solche verwenden.

$foo = &$bar;

$foo und $bar sind hier gleich. Sie zeigen nicht aufeinander. Sie zeigen auf dieselbe Stelle ( den "Wert" ).


Sie können auch innerhalb des array() -Sprachkonstrukts per Referenz zuweisen. Obwohl nicht unbedingt eine Zuordnung durch Verweis.

$foo = 'hi';
$bar = array(1, 2);
$array = array(&$foo, &$bar[0]);

Beachten Sie jedoch, dass Verweise in Arrays potenziell gefährlich sind. Wenn Sie eine normale Zuweisung (ohne Referenz) mit einer Referenz auf der rechten Seite ausführen, wird die linke Seite nicht in eine Referenz verwandelt. Die Referenzen innerhalb von Arrays bleiben jedoch in diesen normalen Zuweisungen erhalten. Dies gilt auch für Funktionsaufrufe, bei denen das Array als Wert übergeben wird.

Die Zuweisung per Referenz ist nicht nur auf Variablen und Arrays beschränkt, sie sind auch für Funktionen und alle Assoziationen "Referenzübergabe" vorhanden.

function incrementArray(&$arr) {
    foreach ($arr as &$val) {
        $val++;
    }
}

function &getArray() {
    static $arr = [1, 2, 3];
    return $arr;
}

incrementArray(getArray());
var_dump(getArray()); // prints an array [2, 3, 4]

Die Zuordnung ist innerhalb der Funktionsdefinition wie oben beschrieben. Sie können einen Ausdruck nicht per Referenz übergeben, sondern nur einen Wert / eine Variable. Daher die Instantiierung von $a in bar() .

Rückkehr per Referenz

Gelegentlich gibt es Zeit für Sie, implizit durch Verweis zurückzukehren.

Die Rückgabe per Referenz ist nützlich, wenn Sie eine Funktion verwenden möchten, um zu ermitteln, an welche Variable eine Referenz gebunden werden soll. Verwenden Sie nicht return-by-reference, um die Leistung zu erhöhen. Der Motor wird dies automatisch selbst optimieren. Geben Sie Referenzen nur dann zurück, wenn Sie einen gültigen technischen Grund haben.

Entnommen aus der PHP-Dokumentation zur Rückgabe nach Verweis .

Es gibt viele verschiedene Formulare, die für die Rückgabe verwendet werden können, einschließlich des folgenden Beispiels:

function parent(&$var) {
    echo $var;
    $var = "updated";
}

function &child() {
    static $a = "test";
    return $a;
}

parent(child()); // returns "test"
parent(child()); // returns "updated"

Die Rückgabe per Referenz ist nicht nur auf Funktionsreferenzen beschränkt. Sie haben auch die Möglichkeit, die Funktion implizit aufzurufen:

function &myFunction() {
    static $a = 'foo';
    return $a;
}

$bar = &myFunction();
$bar = "updated"
echo myFunction();

Sie können einen Funktionsaufruf nicht direkt referenzieren , er muss einer Variablen zugewiesen werden, bevor Sie ihn nutzen können. Um zu sehen, wie das funktioniert, probiere einfach echo &myFunction(); .


Anmerkungen

  • Sie müssen an beiden Stellen, an denen Sie sie verwenden möchten, eine Referenz ( & ) angeben. Das bedeutet für Ihre Funktionsdefinition ( function &myFunction() {... ) und in der aufrufenden Referenz ( function callFunction(&$variable) {... oder &myFunction(); ).
  • Sie können eine Variable nur als Referenz zurückgeben. Daher die Instanziierung von $a im obigen Beispiel. Das bedeutet, dass Sie keinen Ausdruck zurückgeben können, andernfalls wird ein E_NOTICE PHP-Fehler generiert ( Notice: Only variable references should be returned by reference in ...... ).
  • Return by reference hat legitime Anwendungsfälle, aber ich sollte darauf hinweisen, dass sie nur sparsam verwendet werden sollten, nachdem alle anderen potenziellen Optionen zur Erreichung des gleichen Ziels untersucht wurden.

Nach Referenz übergeben

Auf diese Weise können Sie eine Variable als Referenz an eine Funktion oder ein Element übergeben, mit der Sie die ursprüngliche Variable ändern können.

Die Weitergabe per Referenz ist nicht nur auf Variablen beschränkt, Folgendes kann auch als Referenz übergeben werden:

  • Neue Anweisungen, zB foo(new SomeClass)
  • Von Funktionen zurückgegebene Referenzen

Arrays

"Pass-by-Reference" wird häufig verwendet, um Anfangswerte innerhalb eines Arrays zu ändern, ohne neue Arrays zu erstellen oder den Namespace zu verschwenden. Das &$myElement als Referenz ist so einfach wie das Voranstellen / Voranstellen der Variablen mit einem & => &$myElement .

Nachfolgend finden Sie ein Beispiel für die Verwendung eines Elements aus einem Array und das Hinzufügen von 1 zu seinem Anfangswert.

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

Wenn Sie nun ein Element innerhalb von $arr , wird das ursprüngliche Element aktualisiert, wenn der Verweis erhöht wird. Sie können dies überprüfen durch:

print_r($arr);

Hinweis

Sie sollten beachten, wenn Sie innerhalb von Schleifen einen Referenzdurchlauf verwenden. Am Ende der obigen Schleife enthält $num immer noch einen Verweis auf das letzte Element des Arrays. Durch die Zuweisung der Nachschleife wird das letzte Array-Element bearbeitet. Sie können sicherstellen, dass dies nicht geschieht, indem Sie es nach der Schleife unset() :

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

Die oben genannten Punkte stellen sicher, dass Sie keine Probleme haben. Ein Beispiel für Probleme, die sich hieraus ergeben könnten, ist in dieser Frage zu StackOverflow enthalten .


Funktionen

Eine weitere übliche Verwendung für das Weiterleiten von Referenzen ist innerhalb von Funktionen. Das Ändern der ursprünglichen Variablen ist so einfach wie folgt:

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

Was kann durch echo der Originalvariablen überprüft werden.

echo $var;

Es gibt verschiedene Einschränkungen für Funktionen, wie unten in den PHP-Dokumenten angegeben:

Hinweis: Bei einem Funktionsaufruf gibt es kein Referenzzeichen - nur bei Funktionsdefinitionen. Funktionsdefinitionen allein reichen aus, um das Argument korrekt als Referenz zu übergeben. Ab PHP 5.3.0 erhalten Sie eine Warnung, die besagt, dass "Call-Time Pass-by-Reference" veraltet ist, wenn Sie & in foo (& $ a); verwenden. Und seit PHP 5.4.0 wurde die Referenzübergabe für die Aufrufzeit entfernt, so dass die Verwendung dieser Option zu einem schwerwiegenden Fehler führt.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow