Heim > Backend-Entwicklung > PHP-Tutorial > Über globale Probleme in PHP

Über globale Probleme in PHP

WBOY
Freigeben: 2016-10-23 00:12:54
Original
1505 Leute haben es durchsucht

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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

Antwortinhalt:

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

ist richtig.

Noch eine Ergänzung:
Mir wurde klar, dass ich es vorher nicht klar gesehen habe:

<code>global $var1;等于$var1=&$GLOBALS['var1'];
</code>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren

-->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>
Nach dem Login kopieren

}
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>
Nach dem Login kopieren

Beispiel 2

<code><?php
function test(){            
    global $var;
    unset($GLOBALS['var']);                        
    $var=999;
}
test(); 
echo $var;                //错误
?>
</code>
Nach dem Login kopieren

Beispiel 3

<code>    <?php
    function test(){   
        unset($GLOBALS['var']);           
        global $var;              
        $var=999;
    }
    test(); 
    echo $var;                //999
    ?>
</code>
Nach dem Login kopieren

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.

Verwandte Etiketten:
php
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