Maison >développement back-end >tutoriel php >Explication détaillée des exemples de global et $GLOBALS[] en php
Les variables globales de PHP sont un peu différentes du langage C. En langage C, les variables globales prennent automatiquement effet dans les fonctions à moins qu'elles ne soient remplacées par des variables locales
Cela peut causer des problèmes et certaines personnes peuvent être négligentes. Changer une variable globale. Les variables globales en PHP doivent être déclarées globales lorsqu'elles sont utilisées dans une fonction (notez que le mot-clé Global n'est utile que lorsqu'elles sont définies dans une fonction).
1 : La fonction de Global est de définir des variables globales, mais cette variable globale ne s'applique pas à l'ensemble du site Web, mais à la page actuelle, y compris tous les fichiers inclus ou requis.
<?PHP $a=123; function aa() {
Global $a; //Si $a n'est pas défini comme variable globale, le corps de la fonction ne peut pas accéder à $a en dehors du corps de la fonction, mais vous pouvez définir un même nom $a ,À l'heure actuelle, cette variable est une variable locale, qui est équivalente à la variable locale du langage C et ne peut être utilisée qu'à l'intérieur du corps de la fonction.
echo $a; } aa(); ?>
Résumé : les variables globales définies à l'intérieur du corps de la fonction peuvent être utilisées en dehors du corps de la fonction, les variables globales définies en dehors du corps de la fonction ne peuvent pas être utilisées à l'intérieur du corps de la fonction,
$global $a; $a=123; function f() { echo $a; //错误, }
//Regardez à nouveau l'exemple suivant
function f() { global $a; $a=123; } f();
echo $a; //Correct, vous pouvez l'utiliser
2 :analyse globale du problème :
question : J'ai défini certaines variables ($a) dans config.inc.php, et incluses ("config.inc.php") en dehors de la fonction dans d'autres fichiers. Ceux-ci sont nécessaires dans la fonction $a, si elle n'est pas déclarée, echo $a n'imprimera rien. Par conséquent, $a global est déclaré, mais il existe de nombreuses fonctions et de nombreuses variables. Vous ne pouvez pas le déclarer ainsi à plusieurs reprises, n'est-ce pas ? S'il existe une bonne solution, donnez-moi quelques conseils.
réponse1 : Définissez d'abord les constantes dans config.inc.php : définissez (nom constant, valeur constante)
Ensuite, exigez 'config.inc.php' aux autres endroits où il doit être utilisé,
Ensuite, vous can Cette constante est utilisée directement dans ce fichier.
réponse2 : J'ai aussi un moyen, qui consiste à définir un tableau, tel que $x[a], $x, de sorte que vous n'ayez qu'à déclarer global $x.
réponse3 : J’ai essayé votre méthode et cela n’a pas fonctionné.
réponse4 : modifiez votre fichier php.ini.
3. Quelques exemples de tableaux Global et $GLOBALS
Exemple : Utilisation de global
<?PHP $w3sky = 1; $w3sky2 = 2; function Sum() { global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2; }Sum(); echo $w3sky2; ?>
La sortie du script ci-dessus sera "3". Les variables globales $w3sky et $w3sky2 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. PHP n'a pas de limite sur le nombre maximum de variables globales qu'une fonction peut déclarer.
La deuxième façon d'accéder aux variables dans la portée globale consiste à utiliser un tableau $GLOBALS personnalisé PHP spécial. L'exemple précédent peut s'écrire ainsi :
L'exemple utilise $GLOBALS au lieu de global
<?PHP $w3sky = 1; $w3sky2 = 2;function Sum() { $GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2']; }Sum(); echo $w3sky2; ?>
Dans le tableau $GLOBALS, chaque variable est un élément, le nom de la clé correspond à la variable nom et la valeur correspond au contenu de la variable. $GLOBALS existe dans la portée globale car $GLOBALS est une variable superglobale. L'exemple suivant montre l'utilisation de variables super globales :
L'exemple montre des exemples de variables super globales et de portée
<?PHP function test_global() { // 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。 global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。 echo $_POST['name']; } ?>
globale C'est-à-dire, dans un fichier, à condition de le déclarer comme global $db, puis dans la déclaration ci-dessous, vous pouvez référencer ce $db.
4. Au départ, je pensais que global et $GLOBALS étaient identiques, à l'exception des différentes méthodes d'écriture. Cependant, dans les applications pratiques, j'ai trouvé que la différence entre les deux est toujours très grande
Regardez l'exemple suivant ! d'abord :
<?php // 例子1 function test_global() { global $var1, $var2; $var2 =& $var1; } function test_globals() { $GLOBALS['var3'] =& $GLOBALS['var1']; } $var1 = 5; $var2 = $var3 = 0; test_global(); print $var2 ."\n"; test_globals(); print $var3 ."\n"; ?>
Copier le code
Le résultat de l'exécution est :
0
5
Comment cela peut-il arriver, cela ne devrait-il pas être deux 5 ? il y a 1 0 et 1 Et 5 ?
Eh bien, gardons les questions ci-dessus et analysons les principes de $GLOBALS et global en profondeur
Nous savons tous que les variables sont en fait les "noms de code" du physique correspondant ! mémoire dans le code. Supposons les 3 variables que nous avons déclarées ci-dessus. La mémoire allouée est indiquée dans la figure ci-dessous :
Citant l'explication de $GLOBALS 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 !
Analysons ce que le monde a fait ?
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. Pourquoi dit-on cela ?
<?php // 例子2 function test() { global $a; unset($a); } $a = 1; test(); print $a; ?>
执行结果为:
1
为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?
都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入
print $a;
复制代码
来测试!也就是说global产生了test函数外部$a的别名变量“$a”,为了和外面的$a区别,我把它成为--test->$a,那么例子1也这么命名的话,可得出下面的图:
而test_globals执行过以后,看变量的变化:
此时,看图,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!
所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:
global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况(为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。这时候只是指向$var1的指针指向了$var2的指针,只是指针指向变了一下,但是实质上根本就没有改变$var2的值,因此$var2的值仍旧不会变化),例如例子1.
$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致!
注:(接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.(重点)
接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化由下图可以看出)
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!