php 中 global 和$GLOBALS[] 区别

这可能引起一些问题,有些人可能漫不经心的改变一个全局变量。

PHP 中全局变量在函数中使用时必须申明为全局(Global这个关键字在函数中定义才有用)。 

1:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。 

<?PHP 
$a=123; 
function aa() 
{ 
Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a,此时这个变量是局部变量,等同于C语言的局部变量,只能在函数体内部使用。 
echo $a; 
} 
aa(); 
?> 

总结:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,   

 

 

 

2:原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的! 

<?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"; 
?> 

  

执行结果为 0,5

怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢? 

(因为 &$var1 中的var1是一个指向与全局变量指向同一块内存的局部变量,

而用&$var1 对$var2 赋值的时候其实是将var2的作用域从全局替换成了局部,所以结果输出的是0

如果用$var1 对$var2赋值,那么结果会是5)


我们都知道变量其实是相应物理内存在代码中的"代号",假设我们上面声明的3个变量分配的内存如下图表示: 
引用php手册的$GLOBALS的解释: 
Global 变量:$GLOBALS 
注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。 
由所有已定义全局变量组成的数组。变量名就是该数组的索引。 
这是一个“superglobal”,或者可以描述为自动全局变量。 
也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!

 

下面来分析global到底做了什么? 
我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码: 

<?php 
// 例子2 
function test() { 
global $a; 
unset($a); 
} 
$a = 1; 
test(); 
print $a; 
?> 

  结果为1 

 

因为test里面的$a 是别名引用,unset只是unset掉了这个引用变量,外部的全局变量还存在,所以内存不会被回收掉

 

posted @ 2017-05-09 15:46  zeoo  阅读(575)  评论(0编辑  收藏  举报