PHP-Referenz

巴扎黑
巴扎黑Original
2016-11-23 13:15:111021Durchsuche

Die sogenannte Referenz in PHP bedeutet, dass unterschiedliche Namen auf denselben Variableninhalt zugreifen. Es kann für Variablen, Funktionen und Objekte verwendet werden, indem das kaufmännische Und davor eingefügt wird. Lassen Sie uns ausführlich über die Arten und Funktionen von Referenzen sprechen:

1. Referenztypen

1.1. Variablenreferenzen: Zwei Variablen verweisen auf denselben Inhalt

PHP-Code

<?php  
  $a = "abc";   
  $b = &$a;   
  echo $a;//这里输出:abc   
  echo $b;//这里输出:abc   
    
  $b = "done";   
  echo $a;//这里$a的值变为done, 所以输出done   
  echo $b;//这里输出done  
?>


1.2. Funktionsübertragungsreferenz

PHP-Code

function test(&$a)  
{  
    $a=$a+100;   
}  
  
$b=1;  
  
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值,就可以改变$b的值了   
  
echo $b;//输出101

Es ist zu beachten, dass in Hier test(1); wird schief gehen, denken Sie selbst über den Grund nach

1.3, Funktionsreferenz

PHP-Code

function &test()   
{  
    static $b=0;//申明一个静态变量  
    $b=$b+1;  
    echo $b;  
    return $b;  
}  
  
$a=test();//$b的值:1  
  
$a=5;  
$a=test();//$b的值:2  
  
$a=&test();//$b的值:3  
  
$a=5;  
$a=test();//$b的值:6

wird erklärt wie folgt:
Durch den Aufruf einer Funktion mit $a=test() wird der Wert der Funktion nur $a zugewiesen, und alle Änderungen an $a wirken sich nicht auf $b in der Funktion aus. Allerdings gilt $a=&test(). Beim Aufruf einer Funktion besteht ihre Funktion darin, die Speicheradresse der Variablen $b als Rückgabewert $b und die Speicheradresse der Variablen $a auf dieselbe Stelle zu verweisen, was das Äquivalent dieses Effekts erzeugt ($a=&b;). Wenn Sie also den Wert von $a ändern, ändert sich auch der Wert von $b, sodass nach der Ausführung von


$a=&test();

Danach wird der Wert von $b zu 5

Statische Variablen werden hier verwendet, um das Verständnis von Funktionsreferenzrückgaben zu erleichtern. Tatsächlich werden Funktionsreferenzrückgaben hauptsächlich in Objekten verwendet

1.4. Objektreferenz

PHP-Code

class testa  
{  
    var $abc="ABC";   
}  
  
$b=new testa;  
$c = &$b; // or $c = $b;  
echo $b->abc;//这里输出ABC   
echo $c->abc;//这里输出ABC   
$b->abc="DEF";   
echo $c->abc;//这里输出DEF

Der obige Code ist der laufende Effekt in PHP5

In PHP5 ist das Kopieren von Objekten dies wird durch Referenzen erreicht. Im obigen Beispiel ist $b=new a; $c=$b; tatsächlich äquivalent zu $b=new $c=&$b; Möglicherweise möchten Sie eine Kopie eines Objekts erstellen und hoffen, dass Änderungen am Originalobjekt keine Auswirkungen auf die Kopie haben. Zu diesem Zweck definiert PHP eine spezielle Methode namens __clone

2. Die Rolle von Referenzen

Wenn das Programm relativ groß ist, vergleichen Sie Variablen, die auf dasselbe Objekt verweisen Sie möchten das Objekt nach der Verwendung manuell löschen. Ich persönlich empfehle die Verwendung der Methode „&“ und dann die Verwendung von $var=null, um es zu löschen. Verwenden Sie zu anderen Zeiten die Standardmethode von PHP5. Darüber hinaus empfiehlt es sich für die Übertragung großer Arrays in PHP5, die Methode „&“ zu verwenden, da diese schließlich Speicherplatz spart.


3. 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:




setzt $b nicht zurück, sondern zerstört nur $a.
<?php 
   $a = 1; 
   $b =& $a; 
   unset ($a); 
?>

Ein weiteres Beispiel ist die globale Referenz. Bei der Deklaration einer Variablen mit globaler $var wird tatsächlich eine Referenz auf die globale Variable erstellt. Das ist dasselbe wie:



Das bedeutet, dass beispielsweise unset $var eine globale Variable nicht zurücksetzt.
<?php 
    $var =& $GLOBALS["var"]; 
?>

Referenz von $this: In einer Methode eines Objekts ist $this immer eine Referenz auf das Objekt, das es aufruft.


PS:

Ein Vorteil von PHP ist, dass es seinen automatischen Garbage-Collection-Mechanismus (Freigabespeicher) nutzen kann. Das heißt, Sie müssen nach der Verwendung der Variablen keine Verarbeitung durchführen, um den Speicher freizugeben. PHP übernimmt dies für Sie. Natürlich können wir bei Bedarf die Funktion unset() aufrufen, um den Speicher freizugeben, aber im Allgemeinen ist dies nicht erforderlich.

In PHP gibt es jedoch mindestens eine Situation, in der der Speicher nicht automatisch freigegeben wird, wie folgt:


Wenn ja eine Lücke zwischen zwei Objekten Bei einer gegenseitigen Referenzbeziehung, wie z. B. „übergeordnetes Objekt-untergeordnetes Objekt“, wird durch den Aufruf von unset() für das übergeordnete Objekt der Speicher, der auf das übergeordnete Objekt im untergeordneten Objekt verweist, nicht freigegeben (selbst wenn das übergeordnete Objekt Müll ist). gesammelt).



Zu diesem Zeitpunkt, auch wenn unset() manuell aufgerufen wird. Details finden Sie unter: http://bugs.php.net/bug.php?id=33595.

Der Kompromiss besteht darin, die Methode __destruct() im Objekt in der Funktion unset() aufzurufen


--------------------------------- -- -------------------------------------

Ergänzung:

Die Zeigerfunktion (ähnlich dem Zeiger) der Adresse in PHP wird nicht vom Benutzer selbst implementiert, sondern vom Zend-Kern. Die Referenz in PHP übernimmt das Prinzip „Kopieren beim Schreiben“. Das heißt, solange kein Schreibvorgang erfolgt, werden Variablen oder Objekte, die auf dieselbe Adresse zeigen, nicht kopiert.


Laienhaft ausgedrückt
1: Wenn es den folgenden Code gibt:

$a="ABC"
$b=$a; Zu diesem Zeitpunkt zeigen $a und $b beide auf dieselbe Speicheradresse, anstatt dass $a und $b unterschiedliche Speicher belegen

2: Wenn Sie den folgenden Code zum obigen Code hinzufügen

$a="EFG";

Da die Daten im Speicher, auf die $a und $b zeigen, neu geschrieben werden müssen, beurteilt der Zend-Kern zu diesem Zeitpunkt automatisch und erzeugt automatisch Daten von $a für $b. Kopieren Sie ein Stück Speicher und wenden Sie es erneut zur Speicherung an.



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn