2017-09-28 4 views

Antwort

3

In einfachen Worten, Referenzen sind Aliase.

Eine Variable in PHP ist in zwei Teilen gespeichert: Name und Wert. Der Name zeigt auf den Wert.

$x = 2; 
$y = $x; 
$z = &$x; 

Wenn $x = 2; ausgeführt wird, x der Name in der Symboltabelle des aktuellen Bereichs und der Wert wird gespeichert 2 in einem zval gespeichert (nicht fragen, es ist der interne Name einer Datenstruktur, die Geschäfte ein Wert in PHP).

Wenn $y = $x; ausgeführt wird, y der Name in der Symboltabelle des aktuellen Bereichs und der Wert des $x (2) gespeichert ist, in eine neue zval Struktur kopiert.

Wenn $z = &$x; ausgeführt wird, wird der Name z in der Symboltabelle des aktuellen Bereichs gespeichert, aber eine neue zval wird nicht erstellt. Stattdessen wird z auf zval als x gesetzt.

Der Speicher durch die Variablen verwendet $x, $y und $z wie folgt aussehen:

+---------+    +---------+ 
| x | -------------> | 2 | 
+---------+    +---------+ 
           ^
+---------+      |  +---------+ 
| y | -------------------------> | 2 | 
+---------+      |  +---------+ 
           | 
+---------+      | 
| z | --------------------+ 
+---------+ 

Wenn ein Wert, der durch Verweis auf eine Funktion oder eine Funktion gibt die gleichen Dinge passieren, nur eine Referenz übergeben wird die Namen sind in verschiedenen Symboltabellen gespeichert (Anmerkung "current scope" in der obigen Erklärung).

Let‘sehen diesen Code:

function f(& $z) { 
    $y = $z; 
    $z = $z + 2; 
} 
$x = 2; 
f($x); 

Nach $x = 2; der Speicher wie folgt aussieht:

+---------+    +---------+ 
| x | -------------> | 2 | 
+---------+    +---------+ 

Während der Ausführung der Funktion f() sieht der Speicher wie folgt aus:

+===== global ====+ 
| +---------+ |   +---------+ 
| | x | -------------> | 4 | 
| +---------+ |   +---------+ 
+=================+    ^
            | 
+====== f() ======+     | 
| +---------+ |     |  +---------+ 
| | y | -------------------------> | 2 | 
| +---------+ |     |  +---------+ 
|     |     | 
| +---------+ |     | 
| | z | --------------------+ 
| +---------+ | 
+=================+ 

y und z sind s in einer anderen Symboltabelle als x abgerufen und sie (zusammen mit der gesamten Symboltabelle, die sie enthält) entfernt, wenn der Aufruf an f() zurückgibt.

Wenn y entfernt wird, wird dessen Wert ebenfalls entfernt, da kein Name mehr darauf hinweist. Da der Wert, auf den z zeigt, auch auf x zeigt ($z ist ein Alias), wird der Wert nicht zusammen mit z entfernt und überlebt den Funktionsaufruf. f() ändert den Wert mit $z; und diese Änderung ist im Hauptprogramm durch die Variable $x sichtbar.

Die Dinge passieren in ähnlicher Weise, wenn eine Funktion eine Referenz zurückgibt. Die Funktion gibt einen Wert zurück, der nicht kopiert wird, aber ein neuer Name, der darauf verweist, wird in der Symboltabelle des aufrufenden Codes erstellt.

+0

Also, was ist die Geschichte der Referenzierung ** durch Referenz ** in die Funktion? –

+0

mehr über [zval] (http://www.phpinternalsbook.com/php7/internal_types/zvals.html) – hassan

0

Ich empfehle Ihnen, Sprache C Zeiger zu studieren, wenn Sie irgendwelche Zweifel haben, was sie sind.

Wie auch immer, dies ist eine sehr vereinfachte Erklärung:

Referenzen sind nicht die Erinnerung, dass Punktgrößen adressiert, aber sie sind nur ein Weg, um einen Parameter an eine Funktion zu übergeben und zurück, dass Parameter geändert, wenn die Funktion es ändern .