这可能引起一些问题,有些人可能漫不经心的改变一个全局变量。
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掉了这个引用变量,外部的全局变量还存在,所以内存不会被回收掉