In PHP übergibt das &-Symbol eine Variablenreferenz anstelle einer Kopie. Referenz bedeutet, auf denselben Variableninhalt mit unterschiedlichen Namen zuzugreifen. Dies ähnelt nicht den Zeigern von C, bei denen es sich um Symboltabellen-Aliase handelt. Beachten Sie, dass in PHP Variablenname und Variableninhalt unterschiedlich sind, sodass derselbe Inhalt unterschiedliche Namen haben kann. Die engste Analogie sind die Dateinamen von Unix und die Dateien selbst – die Variablennamen sind die Verzeichniseinträge und die Variableninhalte sind die Dateien selbst. Referenzen können als enge Verbindungen im Unix--Dateisystem betrachtet werden.
PHP-Referenzen ermöglichen es Ihnen, zwei Variablen zu verwenden, um auf denselben Inhalt zu verweisen. Das heißt, wenn Sie Folgendes tun:
<?php $a =&$b ?>
bedeutet dies, dass $a und $b auf dieselbe Variable verweisen.
Hinweis: $a und $b sind hier genau gleich. Das bedeutet nicht, dass $a auf $b zeigt oder umgekehrt, sondern dass $a und $b auf die gleiche Stelle zeigen.
Die gleiche Syntax kann in Funktionen, die Referenzen zurückgeben, und im neuen Operator (PHP 4.0.4 und höher) verwendet werden:
<?php $bar =& new fooclass(); $foo =& find_var ($bar); ?>
Hinweis: Wenn der &-Operator nicht verwendet wird, wird eine Kopie des Objekts generiert. Wenn Sie $this in einer Klasse verwenden, gilt es für die aktuelle Instanz dieser Klasse. Eine Zuweisung ohne & kopiert die Instanz (z. B. ein Objekt) und $this wird auf die Kopie angewendet, was nicht immer das gewünschte Ergebnis ist. Aufgrund von Leistungs- und Speicherverbrauchsproblemen möchten Sie normalerweise nur an einer Instanz arbeiten.
Obwohl Sie den @-Operator verwenden können, um alle Fehlermeldungen in einem Konstruktor auszuschalten, beispielsweise mit @new, hat dies keine Auswirkung, wenn Sie eine &new-Anweisung verwenden. Dies ist eine Einschränkung der Zend-Engine und führt zu einem Parsing-Fehler.
Das zweite, was eine Referenz bewirkt, ist die Übergabe einer Variablen als Referenz. Dies wird erreicht, indem eine lokale Variable innerhalb der Funktion erstellt wird und diese Variable auf denselben Inhalt im aufrufenden Bereich verweist. Beispiel:
<?php function foo (&$var) { $var++; } $a=5; foo ($a); ?>
ändert $a in 6. Dies liegt daran, dass in der Funktion foo die Variable $var auf dasselbe zeigt wie $a. Eine ausführlichere Erklärung finden Sie unter „Übergabe als Referenz“.
Die dritte Funktion einer Referenz ist die Referenzrückgabe.
Was eine Referenz nicht ist
Wie bereits erwähnt, ist eine Referenz kein Zeiger. Dies bedeutet, dass die folgende Struktur nicht den erwarteten Effekt erzielt:
<?php function foo (&$var){ $var =& $GLOBALS["baz"]; } foo($bar); ?>
Dies führt dazu, dass die Variable $var in der Funktion foo an $bar gebunden wird, wenn die Funktion aufgerufen wird, aber dann wird es erneut an $GLOBALS["baz"] gebunden. Es ist nicht möglich, $bar über den Referenzmechanismus an eine andere Variable innerhalb des Funktionsaufrufbereichs zu binden, da es in der Funktion foo keine Variable $bar gibt (sie wird als $var dargestellt, aber $var hat nur den Variableninhalt und keinen Aufruf Name-Wert-Bindung der Symboltabelle).
Übergabe als Referenz
Sie können eine Variable als Referenz an eine Funktion übergeben, sodass die Funktion den Wert ihres Arguments ä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.
Folgendes kann als Referenz übergeben werden:
Variablen wie foo($a)
Neue Anweisungen wie foo(new foobar())
Von Funktionen zurückgegebene Referenzen wie:
<?php function &bar() { $a = 5; return $a; } foo(bar()); ?>
Ausführliche Erklärung siehe Referenzrückgabe.
Jeder andere Ausdruck kann 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()); 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 eine Funktion verwenden möchten, um herauszufinden, an welche Variable die Referenz gebunden werden soll. Wenn Sie eine Referenz zurückgeben, verwenden Sie diese Syntax:
<?php function &find_var ($param){ /* ...code... */ return $found_var; } $foo =& find_var ($bar); $foo->x = 2; ?>
In diesem Fall werden die Eigenschaften des von der Funktion find_var zurückgegebenen Objekts festgelegt (Übersetzer: Bezieht sich auf $foo->x = 2 ;-Anweisung) statt zu kopieren, genau wie ohne Verwendung der Referenzsyntax.
Hinweis: Anders als bei der Parameterübergabe muss hier das kaufmännische Und-Zeichen an beiden Stellen verwendet werden – um anzuzeigen, dass eine Referenz zurückgegeben wird, nicht eine übliche Kopie, und auch um anzuzeigen, dass $foo als Referenz und nicht als übliche Zuweisung gebunden ist.
Referenz aufheben
Wenn Sie eine Referenz aufheben, brechen Sie einfach die Bindung zwischen dem Variablennamen und dem Variableninhalt auf. Dies bedeutet nicht, dass die Variableninhalte zerstört werden. Beispiel:
<?php $a = 1; $b =& $a; unset ($a); ?>
deaktiviert $b nicht, sondern nur $a.
Eine Analogie zwischen diesem und dem Unlink-Aufruf von Unix kann zum Verständnis beitragen.
Referenzpositionierung
Viele PHP-Syntaxstrukturen werden über den Referenzmechanismus implementiert, daher gilt alles, was oben über die Referenzbindung gesagt wurde, auch für diese Strukturen. Einige Konstrukte wie Pass-by-Reference und Return wurden bereits oben erwähnt. Andere Strukturen, die Referenzen verwenden, sind:
Globale Referenz
Wenn Sie eine Variable mit globaler $var deklarieren, erstellen Sie tatsächlich eine Referenz auf die globale Variable. Das ist dasselbe wie:
<?php $var =& $GLOBALS["var"]; ?>
这意味着,例如,unset $var 不会 unset 全局变量。
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。
Das obige ist der detaillierte Inhalt vonWie ist das „&'-Symbol zu verstehen, das zu benutzerdefinierten PHP-Funktionen hinzugefügt wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!