Guten Tag allerseits, ich habe diesen Wissenspunkt im Internet gesehen:
Auf globale Variablen, die innerhalb einer Funktion deklariert wurden, kann das externe Hauptprogramm zugreifen
Dann habe ich den folgenden Code ausgeführt und die obige Schlussfolgerung überprüft:
<code><?php function test_global() { global $vars; $vars='OK'; } test_global(); echo $vars; //OK ?> </code>
Basierend auf der obigen Theorie habe ich den folgenden Code geschrieben:
<code><?php $var1 = 1; function test(){ global $var1; unset($GLOBALS['var1']); echo $var1; } test(); echo $var1; ?> </code>
Global $var1 in der Testfunktion ist ein Verweis auf die externe Variable $var1, unset($GLOBALS['var1']); bewirkt, dass die externe $var1 vom Speicher getrennt wird (die Variable $var1 wird zerstört)
Dann kommt hier die Frage
Gemäß der Theorie am Anfang der Frage kann auf $var1 innerhalb der Funktion immer noch von außerhalb der Funktion zugegriffen werden, selbst wenn die externe $var1 nicht gesetzt ist? ($var1 in der Funktion ist ebenfalls global!), aber warum meldet echo $var1 am Ende einen Fehler?
Bitte geben Sie mir einen Rat, danke!
Außerdem habe ich noch eine Frage, ich hoffe, jemand kann mir helfen
https://segmentfault.com/q/10...
Guten Tag allerseits, ich habe diesen Wissenspunkt im Internet gesehen:
Auf globale Variablen, die innerhalb einer Funktion deklariert wurden, kann das externe Hauptprogramm zugreifen
Dann habe ich den folgenden Code ausgeführt und die obige Schlussfolgerung überprüft:
<code><?php function test_global() { global $vars; $vars='OK'; } test_global(); echo $vars; //OK ?> </code>
Basierend auf der obigen Theorie habe ich den folgenden Code geschrieben:
<code><?php $var1 = 1; function test(){ global $var1; unset($GLOBALS['var1']); echo $var1; } test(); echo $var1; ?> </code>
Global $var1 in der Testfunktion ist ein Verweis auf die externe Variable $var1, unset($GLOBALS['var1']); bewirkt, dass die externe $var1 vom Speicher getrennt wird (die Variable $var1 wird zerstört)
Dann kommt die Frage
Laut der Theorie am Anfang der Frage kann auf $var1 innerhalb der Funktion immer noch von außerhalb der Funktion zugegriffen werden, selbst wenn die externe $var1 nicht gesetzt ist? ($var1 in der Funktion ist ebenfalls global!), aber warum meldet echo $var1 am Ende einen Fehler?
Bitte geben Sie mir einen Rat, danke!
Außerdem habe ich noch eine Frage, ich hoffe, jemand kann mir helfen
https://segmentfault.com/q/10...
kann folgendermaßen verstanden werden: global $var1;
ist gleich $var1=&$GLOBALS['var1'];
<code><?php $var1 = 1; function test(){ global $var1; unset($GLOBALS['var1']); echo $var1; } test(); echo $var1; ?></code>
Sie können die Laufergebnisse des oberen und unteren Abschnitts vergleichen
<code><?php $var1 = 1; function test(){ global $var1; unset($var1); echo $var1; } test(); echo $var1; ?></code>
Lassen Sie mich auch einen Absatz hinzufügen
<code><?php //#1全局的时候$GLOBALS['var']就是$var。 $var=999; unset($GLOBALS['var']); var_dump($var); //报错 NULL //#2在函数内部,$GLOBALS['var']就是外部全局的$var $var=999; function test(){ unset($GLOBALS['var']); } test(); var_dump($GLOBALS['var']); //报错 NULL var_dump($var); //报错 NULL //#3没有全局$var的时候,函数内部执行global $var;会创建一个空值的内部$var和一个空值的外部$var,在链接起来。 function test2(){ global $var; var_dump($var); //NULL var_dump($GLOBALS['var']); //NULL $var = 999; } test2(); var_dump($var); //999 var_dump($GLOBALS['var']); //999</code>
Was Sie deklarieren, ist eine globale Variable. Da sie global ist, können Sie sie innerhalb oder außerhalb der Funktion löschen.
Nach dem Löschen ist es nicht mehr relevant, ob Sie sich innerhalb oder außerhalb der Funktion befinden.
Hinweis:
Die Variablen innerhalb und außerhalb der Funktion sind gleich und zeigen auf denselben Zeiger.
Nach der Deklaration einer globalen Variablen wird keine Variable innerhalb der Funktion und keine Variable außerhalb der Funktion erstellt.
Ergänzung:
Mein Verständnis ist falsch, unten sagte @Mi Mo
:
<code>global $var1;等于$var1=&$GLOBALS['var1']; </code>
ist richtig.
Noch eine Ergänzung:
Mir wurde klar, dass ich es vorher nicht klar gesehen habe:
<code>global $var1;等于$var1=&$GLOBALS['var1']; </code>
Dieser Satz ist richtig, aber mir ist die Existenz von & vorher nicht aufgefallen.
Weil es einfacher zu verstehen scheint, wenn Sie das & entfernen.
Aber tatsächlich & existiert, also ist es immer noch dasselbe wie das, was ich oben gesagt habe: $var1 inside und external zeigen auf dieselbe Adresse.
Schauen wir uns noch einmal das Beispiel an:
<code>$var1 = 1; function test(){ global $var1; unset($GLOBALS['var1']); echo $var1; } test(); //1 已经删除了$var1,为什么函数内的$var1还存在呢? echo $var1;//Undefined</code>
-->Frage: Da es sich um dasselbe handelt, warum gibt das eine eine Ausgabe aus und das andere meldet einen Fehler?
Versuchen Sie es mit einem anderen:
$var1 = 1;
function test(){
<code>global $var1; $GLOBALS['var1']=99; echo $var1;</code>
}
test(); //99
echo $var1;//99
-->Wenn Sie das eine ändern, ändert sich gleichzeitig auch das andere, was bedeutet, dass sie immer noch dasselbe sein sollten, oder?
Also, was ist das Problem?
Eigentlich liegt das Problem in der Funktion unset():
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.
(Referenz: http://blog.csdn.net/ebw123/a...)
Ich habe jetzt einen vorläufigen Hinweis gefunden, schauen Sie sich den Code unten an:
Beispiel 1
<code><?php function test(){ global $var; $var=999; } test(); echo $var; //999 ?></code>
Beispiel 2
<code><?php function test(){ global $var; unset($GLOBALS['var']); $var=999; } test(); echo $var; //错误 ?> </code>
Beispiel 3
<code> <?php function test(){ unset($GLOBALS['var']); global $var; $var=999; } test(); echo $var; //999 ?> </code>
Wenn man den Code in der Frage und dieser Antwort kombiniert, sieht die Zusammenfassung wie folgt aus:
Verwenden Sie unset($GLOBALS['var']) innerhalb der Funktion
1: Es wird die $var-Variable außerhalb der Funktion zerstört (da $GLOBALS['var'] die externe $var selbst ist)
2:
Wenn es eine globale Variable gibt (auf die extern zugegriffen werden kann) vor unset($GLOBALS['var']); dann bricht unset($GLOBALS['var']); Zugriff auf „Rechte“ globaler Variablen innerhalb von Funktionen
Wenn nach unset($GLOBALS['var']); bereits eine globale Variable vorhanden ist (auf die extern zugegriffen werden kann), stört unset($GLOBALS['var']); „Rechte“ für globale Variablen in externen Zugriffsfunktionen
Frage:
Zusätzlich zu unset($GLOBALS['var']); können Sie die externe Variable $var zerstören, sodass der Refcount des zval, auf den sie zeigt, um eins reduziert wird,
Könnte dadurch auch der Gültigkeitsbereich der globalen Variablen ursprünglich innerhalb der Funktion von global auf lokal geändert werden (was dazu führt, dass Außenstehende nicht mehr auf globale Variablen innerhalb der Funktion zugreifen können)?
Hoffentlich kann Gott mir etwas Führung geben.