Maison  >  Article  >  développement back-end  >  Analyse de la différence entre global et $GLOBAL en php

Analyse de la différence entre global et $GLOBAL en php

不言
不言original
2018-07-18 11:48:474160parcourir

La plupart des gens pensent que global et $GLOBALS[] sont simplement différents dans l'écriture, mais en fait ce n'est pas le cas. Examinons les différences entre eux.

Selon l'explication officielle,

$GLOBALS['var'] est la variable globale externe $var elle-même.

global $var est une référence ou un pointeur du même nom vers une $var externe. (Erreur : il s'agit uniquement d'une référence d'alias, pas d'un pointeur !!!)

Donnez un exemple :

Utilisation de php $GAOBAL[] :

01    <?php    
02    $var1 = 1;    
03    $var2 = 2;    
04    function test() {    
05        $GLOBALS[&#39;var2&#39;] = &$GLOBALS[&#39;var1&#39;];    
06    }    
07    
08    test();    
09    echo $var2;    
10    ?>

Résultats d'impression normaux Pour l'utilisation de 1

php global :

01    <?php    
02    $var1 = 1;    
03    $var2 = 2;    
04    
05    function test(){    
06        global $var1, $var2;    
07        $var2 = &$var1;    
08        echo $var2;    
09        $var2 = &#39;qianyunlai.com&#39;;    
10    }    
11    
12    test(); // 输出 1    
13    echo $var2; // 输出 2    
14    echo $var1; // 输出 qianyunlai.com    
15    ?>

$var1 et $va2 dans la fonction test() sont des variables locales, mais elles sont référencées séparément après ajout du global mot-clé Pointe vers les variables globales $var1, $va2. Lorsque $var2 = &$var1;, la variable locale $var2 ne pointe plus vers la variable globale $val2, mais pointe à nouveau vers la variable globale $var1. , la variable locale $var2 Le changement n'affectera plus la variable globale $val2, mais affectera la variable globale redirigée $val1.

Regardons un autre exemple.

1    <?php    
2    $var1 = 1;    
3    function test(){    
4        unset($GLOBALS[&#39;var1&#39;]);    
5    }    
6    test();    
7    echo $var1;    
8    ?>

Comme $var1 a été supprimé, rien n'est imprimé.

01    <?php    
02    $var1 = 1;    
03    
04    function test(){    
05        global $var1;    
06        unset($var1);    
07    }    
08    
09    test();    
10    echo $var1;    
11    ?>

Imprimé accidentellement 1.

Cela prouve que seul l'alias est supprimé, et la référence de $GLOBALS['var'] n'a en aucun cas changé.

Compris ?

En d'autres termes, global $var est en fait $var = &$GLOBALS['var']. C'est juste un alias pour appeler une variable externe.

Global et $GLOBALS en PHP sont non seulement écrits différemment, mais la différence entre les deux est quand même très grande. Vous devez y prêter attention dans les applications pratiques !

Regardez d'abord l'exemple suivant :

1    <?php    
2    $id = 1;    
3    function test() {    
4        global $id;    
5        unset($id);    
6    }    
7    test();    
8    echo($id); // 输出 1    
9    ?>

Positionnement de référence

De nombreuses structures de syntaxe PHP sont implémentées via le mécanisme de référence, donc tout ce qui précède concernant la liaison de référence est également applicable à ces structures. Certaines constructions, telles que le passage par référence et le retour par référence, ont déjà été mentionnées ci-dessus. D'autres structures qui utilisent des références sont :

Lors de la déclaration d'une variable avec global $var, vous créez en fait une référence à la variable globale. Cela revient à faire :

01    <?php    
02    $GLOBALS["var1"] = 1;    
03    $var = &$GLOBALS["var1"];    
04    unset($var);    
05    echo $GLOBALS[&#39;var1&#39;]; //输出1    
06    //############################################    
07    $GLOBALS["var1"] = 1;    
08    $var = &$GLOBALS["var1"];    
09    unset($GLOBALS[&#39;var1&#39;]);    
10    echo $var; //输出1    
11    //############################################    
12    //如果写成如下,则会出错    
13    $GLOBALS["var"] = 1;    
14    $var = &$GLOBALS["var"];    
15    unset($GLOBALS[&#39;var&#39;]);    
16    echo $var; //脚本没法执行    
17    //###########################################    
18    ?>

Cela signifie que, par exemple, unset $var ne supprimera pas une variable globale.

unset rompt simplement la liaison entre le nom de la variable et le contenu de la variable. Cela ne signifie pas que le contenu des variables est détruit.

Renvoie false lors de l'utilisation d'isset($var). $this Dans une méthode d'un objet, $this est toujours une référence à l'objet qui l'appelle.

Si une référence est affectée à une variable déclarée globale à l'intérieur d'une fonction, la référence n'est visible qu'à l'intérieur de la fonction.

Cela peut être évité en utilisant le tableau $GLOBALS.

Exemple de référencement de variables globales dans une fonction :

01    <?php    
02    $var1 = "Example variable";    
03    $var2 = "";    
04    
05    function global_references($use_globals) {    
06        global $var1, $var2;    
07        if (!$use_globals) {    
08            $var2 = &$var1; // visible only inside the function    
09        } else {    
10            $GLOBALS["var2"] = &$var1; // visible also in global context    
11        }    
12    }    
13    
14    global_references(false);    
15    echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;&#39;    
16    global_references(true);    
17    echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;Example variable&#39;    
18    ?>

Traitez global $var; comme l'abréviation de $var = &$GLOBALS['var'];. Ainsi, si vous attribuez une autre référence à $var, vous modifiez uniquement la référence à la variable locale.

Comme mentionné précédemment, les références ne sont pas des pointeurs. Cela signifie que la structure suivante n'aura pas l'effet escompté :

1    <?php    
2    $bar = 3;    
3    function foo(&$var) {    
4        $GLOBALS["baz"] = 5;    
5        $var = &$GLOBALS["baz"];    
6    }    
7    foo($bar);    
8    echo $bar;//输出3    
9    ?>

Cela fera que la variable $var dans la fonction foo sera liée à $bar lorsque la fonction est appelée, mais ensuite liée à nouveau Il est défini sur $GLOBALS["baz"].

Il n'est pas possible de lier $bar à d'autres variables dans la portée de l'appel de fonction via le mécanisme de référence, car il n'y a pas de variable $bar dans la fonction foo (elle est représentée par $var, mais $var n'a que contenu des variables sans appeler la liaison nom-valeur dans la table des symboles). Vous pouvez utiliser des retours de référence pour référencer les variables sélectionnées par la fonction.

Explication de $GLOBALS citée dans le manuel PHP :

Variable globale : $GLOBALS, Remarque : $GLOBALS est applicable dans PHP 3.0.0 et versions ultérieures.

Un tableau composé de toutes les variables globales définies. Le nom de la variable est l'index dans le tableau. Il s'agit d'une "superglobale", ou peut être décrite comme une variable globale automatique.

C'est-à-dire que $var1 et $GLOBALS['var1'] dans le code ci-dessus font référence à la même variable, pas à 2 variables différentes !

Si une référence est affectée à une variable déclarée globale à l'intérieur d'une fonction, la référence n'est visible qu'à l'intérieur de la fonction. Cela peut être évité en utilisant le tableau $GLOBALS.

Nous savons tous que les variables générées par les fonctions en PHP sont des variables privées de la fonction, donc les variables générées par le mot-clé global ne peuvent certainement pas échapper à cette règle global génère un alias dans la fonction qui pointe vers l'externe. variable de la fonction, plutôt que des variables réelles externes à la fonction. Une fois l'adresse de pointage de la variable alias modifiée, des situations inattendues se produiront en effet comme une variable externe, et elle restera toujours cohérente. à l'intérieur et à l'extérieur de la fonction.

01    <?php    
02    $a = 1;    
03    $b = 2;    
04    function Sum() {    
05        global $a, $b;    
06        $b = $a + $b;    
07    }    
08    Sum();    
09    echo $b;    
10    ?>

La sortie sera « 3 ». Les variables globales $a et $b sont déclarées dans la fonction et toutes les variables de référence de n'importe quelle variable pointeront vers les variables globales.

Pourquoi n'est-il pas 2 ? Cela n'a-t-il aucun effet en dehors de la fonction ? Veuillez noter que $b n'est pas modifié par référence dans la fonction, mais le $b modifié pointe vers la valeur de la mémoire physique, donc l'entrée externe est 3.

Recommandations associées :

Portée et différences des variables PHP Global et $GLOBALS

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn