Heim > Backend-Entwicklung > PHP-Tutorial > Detaillierte Erläuterung der PHP-Variablenreferenz und des Variablenzerstörungsmechanismus

Detaillierte Erläuterung der PHP-Variablenreferenz und des Variablenzerstörungsmechanismus

墨辰丷
Freigeben: 2023-03-28 12:06:02
Original
1323 Leute haben es durchsucht

Variablen sind ein sehr wichtiger Typ in PHP. Werfen wir einen Blick auf Variablenreferenz und Variablenzerstörung.

PHP-Variablenreferenz und Variablenzerstörungsmechanismus

In PHP stellt das Symbol „&“ eine Referenz dar.

1. Schauen Sie sich die Situation ohne Anführungszeichen an:

$a = “hello world”;//定义一个变量,下面赋值给$b
$b = $a;//这一步没有在$a之前加符号&,像这样子”$b= & $a”。没有加&,实际上原理是会将变量$a复制拷贝一份,也就是内存中重新申请一个地址存储变量$b了
Nach dem Login kopieren

ps: Verwenden Sie in PHP direkt „=" Bei der Zuweisung wird tatsächlich eine Kopie der Variablen auf der rechten Seite nach b kopiert, wodurch ein Speicherplatz generiert wird. Dadurch kann derselbe Inhalt in zwei Kopien im Speicher gespeichert werden. Wie in einigen Aspekten zur PHP-Leistung erwähnt, wird dadurch mehr Speicherplatz belegt. Bei meinen Kontakten haben die meisten Menschen dem jedoch nicht viel Aufmerksamkeit geschenkt. Tatsächlich ist der signifikante Unterschied, der durch die allgemeine Anwendung auf diese Weise verursacht wird, nicht offensichtlich. Sie werden keinen Effekt sehen. Tatsächlich verwende ich & nicht oft für Zitate, haha. Ich halte es nur für sehr wichtig, ein tiefes Verständnis der Umsetzungsprinzipien zu haben. Ich konzentriere mich gerne auf grundlegende Dinge.

2. Verwenden Sie das Symbol & als Referenz

$a = “hello world”;
$b = & $a;
Nach dem Login kopieren

Bei Verwendung von Referenz kopiert die PHP-Engine kein Tatsächlich zeigt der Zeiger auf die Adresse von $a im Speicher und $b speichert diesen Zeiger.
Wenn Sie also Referenzen verwenden und den Wert von $b ändern, ändert sich auch $a entsprechend

Zum Beispiel:

$a = “hello world”;
$b = & $a;
$b = “test new value”;//把b的值改掉,a的值也会跟着改变
echo $a;//输出test new value,因为改变了b的值也会改变a的值。
=====================================
经常在定义函数的时候看到像这样的情况:
function test (& $param)
{
//函数定义的内容
$param++;
}
Nach dem Login kopieren

Erklärung: Vor $param steht eine Referenz, sodass die übergebenen Parameter nicht in den Speicher kopiert werden, sondern direkt auf den ursprünglichen Speicherbereich verweisen. Also: Wenn der mit dem Symbol & übergebene Variablenwert geändert wird, wird auch der Wert im ursprünglichen Speicherbereich geändert.

Machen Sie einen Test wie folgt:

$k = 8;
test($k);
echo $k;//结果$k的值被函数里面改变了,输出9。
还会经常看到这样子调用函数:
$return = & test_func();
Nach dem Login kopieren

Ich habe vorhin erfahren, dass der Mechanismus der PHP-Engine ist: = kopiert den Inhalt auf die Variable von rechts nach links. Die Verwendung von & bedeutet also, das Ergebnis der Funktion zu kopieren. Tatsächlich ist mein Verständnis so, dass der Zeiger auf die Variable auf der linken Seite gegeben wird.

Was ist ein Zeiger? Ich habe das Konzept in der C-Sprache gelernt. Mein Verständnis ist: Zeiger, Zeiger, Zeigenadel (Kompass, haha). Es ist einfacher zu verstehen, wenn Sie sich einen Zeiger als Speicheradresse vorstellen. Der Computer weiß, wo sich Daten im Speicher befinden. Das ist ein oberflächliches Verständnis, ich weiß nicht, wie ich es im Detail verstehen soll, haha.

Zusammenfassung: Durch die Verwendung von Referenzen wird die Speicherressourcennutzung reduziert.

Das PHP-Handbuch erklärt die Referenz wie folgt:

Referenz bedeutet in PHP, auf denselben Variableninhalt mit unterschiedlichen Namen zuzugreifen. Dies ist kein C-Zeiger; die Referenz ist ein Symboltabellenalias. Beachten Sie, dass in PHP Variablennamen und Variableninhalte 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 Hardlinks in Unix-Dateisystemen betrachtet werden.

3. Beim Zerstören von Variablen. Der ursprüngliche Wert wird dadurch nicht geändert.

Test: $b = & $a;

Da sich der Wert von $b ändert, ändert sich auch der Wert von $a, wenn $b zerstört wird (. Speicher Es nimmt keinen Platz mehr ein, ist nicht null und hat keinen Wert von „“). Wird auch der Wert von $a gelöscht?

Tatsächlich gibt es ein ausländisches Buch über PHP, das diesen Mechanismus ausdrücklich erwähnt. Habe es vor 2 Jahren gesehen. Ich erinnere mich nicht mehr genau. Das Prinzip besteht darin, dass beim Löschen einer Variablen diese automatisch kopiert wird.
Tatsächlich soll dadurch vermieden werden, dass $b gelöscht wird und das Problem des Löschens von $a entsteht.

<?php
$a = &#39;d&#39;;
$b = & $a;
$b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
var_dump($b,$a);
unset($b);//调用unset删除b变量,a变量不会删除
var_dump($b,$a);//输出null和8
?>
Nach dem Login kopieren

Beim Aufruf von unset zum Löschen der $b-Variablen entdeckte die PHP-Engine in der Variablensymboltabelle: Die Variable $b, die ich löschen wollte, verwies ursprünglich auf die Variable $ a, dies ist nicht einfach zu löschen, da die Variable $ a nach dem Löschen nicht mehr vorhanden ist. Daher kopieren wir zuerst die Variable $ a und löschen dann die Variable $ b.

Über die PHP-Symboltabelle: Nach meinem Verständnis werden alle Variablennamen während des Betriebs darin aufgezeichnet und von PHP verwaltet. Die spezifischen Daten werden natürlich im Speicher gespeichert Recyceln Sie den Variablenspeicher, geben Sie Speicherplatz frei. Werfen Sie einen Blick auf den Garbage-Collection-Mechanismus von PHP (nicht mehr genutzten Speicherplatz freigeben), der auf der Symboltabelle basiert.

Beispiele

<?php
$long="big_long_variable_name";
$$long="PHP";   /* 用存放在变量$long里的字符串作为新变量的变量名,等同于$big_long_variable_name="PHP"; */
$short=& $big_long_variable_name; /* 取变量$big_long_variable_name的值赋给变量$short,此时$short的值为"PHP",等同于$short=& $$long; */
print "01 /$short is $short.";  /* "/$"是转义序列,表示输出一个美元符号$,下同。本语句的作用是输出:01 $short is PHP. */
print "02 Long is $big_long_variable_name."; /* 输出:02 Long is PHP. */
?>
<br />
<br />
<?php $big_long_variable_name.=" rocks!"; /* 重新对$big_long_variable_name赋值。重新赋值过程中,由于在$big_long_variable_name的后面添加了.(点号),因而变量$big_long_variable_name此时的值应为原值("PHP")+新值(" rocks!"),即变量$big_long_variable_name当前完整的值为"PHP rocks!"。下同。*/
print "03 /$short is $short";  /* 输出:03 $short is PHP rocks! */
print "04 Long is $big_long_variable_name"; /* 输出:04 Long is PHP rocks! */
?>
<br />
<br />
05 $short is PHP rocks!
06 Long is PHP rocks!
<br />
<br />
<?php $short.="Programming $short";  /* 重新对变量$short赋值。由于在$short后面添加了.(点号),因此请参考上例分析$short的值。*/
print "07 /$short is $short";  /* 输出:07 $short is PHP rocks!Programming PHP rocks! */
print "08 Long is $big_long_variable_name"; /* 由于变量$short被重新赋值为Programming PHP rocks!,因而变量$big_long_variable_name的值也与$short一同被改变为"PHP rocks!Programming PHP rocks!"。本语句输出:08 Long is PHP rocks!Programming PHP rocks!注意,如果是对具有相同值的一个变量进行销毁unset( ),则另一个变量不适用于此种情况,即不会随之被一同销毁。*/
?>
<br />
<br />
09 $short is Programming PHP rocks!
10 Long is Programming PHP rocks!
<br />
<br />
<?php $big_long_variable_name.="Web Programming $short"; /* 变量$big_long_variable_name被重新赋值,此时它完整的值应为PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks!。变量$short的值此时与变量$big_long_variable_name一致。请分别参考第5处、第10处注释进行分析。*/
print "11 /$short is $short";   /* 输出:11 PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "12 Long is $big_long_variable_name";
?>
<br />
<br />
<?php
unset($big_long_variable_name);  /* 用unset( )销毁变量$big_long_variable_name,变量$short不会因此受到任何影响。*/
print "13 /$short is $short";  /* 虽然销毁了变量$big_long_variable_name,但$short没有受到影响,它的值仍是最近一次被赋予的PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "14 Long is $big_long_variable_name."; /* 变量$big_long_variable_name已被销毁,故而无值。输出:14 Long is. */
snow;                  
?>
<br />
<br />
<?php $short="No point TEST1";  /* 重新对变量$short赋值。由于这次没有在$short后面添加.(点号),因此$short当前的值为"No point TEST1"。*/
print "15 /$short is $short.";  /* 输出:15 $short is No point TEST1. */
$short="No point TEST2 $short";  /* 重新对变量$short赋值。没在$short的后面添加.(点号),但引用了它自身最近一次的值"No point TEST1"。*/
print "16 /$short is $short.";  /* 输出:16 $short is No point TEST2 No point TEST1. */
Nach dem Login kopieren

Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Lernen aller hilfreich sein wird.


Verwandte Empfehlungen:

PHP Relevante Kenntnisse und Anwendung des Datei-Uploads

PHP-Schleifen – Das Verständnis von While-Schleifen hängt mit der Verwendung von

PHP 5 Echo und zusammen Druckaussagen Wissen und Anwendung

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der PHP-Variablenreferenz und des Variablenzerstörungsmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage