在PHP中经常遇到$GLOBALS和global来定义和访问全局变量,那么在什么地方该用$GLOBALS,而什么地方该用global呢?这就需要我们清除了解$GLOBALS和global的区别,我也谈谈PHP中$GLOBALS和global的不同,要真正弄懂它们的区别和共同点请仔细看这篇文章。
$GLOBALS和global的本质不同
$GLOBALS和global不光有区别,还有本质不同。
$GLOBALS是一个数组,它是一个包含了全部变量的全局组合数组。而global是一个PHP关键字,它可以将一个变量的作用域变成全局的。在PHP官方手册中有这句话:
The global keyword is used to manipulate variable scope, and there is also the concept of super globals in PHP, which are special variables with a global scope.
也就是说,global声明一个变量,这个变量就具有全局作用域。比如在函数内部要访问函数外部定义的一个变量,就要用global关键字在函数内部声明这个变量。或者在函数内部声明了一个变量是global,那么在函数外部通过global声明这个变量,也就可以全局访问了。
$GLOBALS使用范例
$GLOBALS使用示例1:
function test() {
$foo = "local variable";
echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>
在该例中,有两个$foo,一个在函数内,一个在函数外,它们的作用域不同,一个作用域是函数内的,一个作用域是全局的,这个全局指的是在这个php文件中,或者被include或require进的php文件中。我们探讨$GLOBALS和global的区别的时候,重点就是关注变量的作用域。
这个程序的输出结果是:
$foo in global scope: Example content
$foo in current scope: local variable
第一个结果是在函数内部通过$GLOBALS访问全局变量的那个$foo,可以获取并且输出。第二个结果是输出局部变量也就是函数内定义的$foo.
$GLOBALS使用示例2:
function errfunc() {
echo $PHP_SELF;
}
errfunc();
?>
本例中声明了一个变量$PHP_SELF,它的作用域是这个函数内,而直接echo这个变量会出错,因为undefined,没有定义。在PHP中,PHP_SELF这个名字应该很熟悉吧,它是自动生成的一个全局变量,表示当前网页地址。既然是自动生成的全局变量,也就可以通过$GLOBALS来访问了,如下例:
function myfunc() {
echo $GLOBALS["PHP_SELF"];
}
myfunc();
这样通过$GLOBALS访问的PHP_SELF就是全局变量中的,而这个变量很特殊,是系统自动生成的。
global使用示例
global使用示例1
$name='Steve';
function myname(){
global $name;
echo $name;
}
myname();
?>
$name='Steve';
function myname(){
global $name;
echo $name;
}
myname();
?>
这个简单的例子就是在函数内部访问外部全局变量$name然后输出它,如果不用global就会出错。
global使用示例2
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>
和上面的例子作用一样,输出PHP_SELF全局变量。这里用的global,把一个变量作用域变成全局的,这就是global和$GLOBALS的共同点。这里global声明了一个变量$PHP_SELF,就创建了外部变量$PHP_SELF的同名引用或指针,从而访问全局变量,这句话又是讲的global和$GLOBALS的不同点。
通过下面的例子就可以看出global和$GLOBALS的区别:
$var1=1;
$var2=2;
function test(){
global $var1,$var2;
$var2=&$var1;
}
test();
echo $var2;
1
2
3
4
5
6
7
8
$var1=1;
$var2=2;
function test(){
global $var1,$var2;
$var2=&$var1;
}
test();
echo $var2;
结果是:2
为什么结果是2?首先通过global将外部变量$var1,$var2变成全局变量,然后$var2引用$var1,很多人就理解为$var2的值和$var1一样了,但是echo $var2是在函数外部,global是在函数内部创建了外部$var2的同名引用,并不是外部$var2本身,所以函数内部的操作并没有改变外部变量$var2的值。
如果用$GLOBALS,如下例那就改变了$var2的值:
$var1=1;
$var2=2;
function test(){
$GLOBALS['var2']=&$GLOBALS['var1'];
}
test();
echo $var2;
$var1=1;
$var2=2;
function test(){
$GLOBALS['var2']=&$GLOBALS['var1'];
}
test();
echo $var2;
结果是1。因为$GLOBALS变量是自己本身。
再如这个例子证明$GLOBALS[‘var’]是自己本身。
$var1=1;
function test(){
unset($GLOBALS['var1']);
}
test();
echo $var1;
1
2
3
4
5
6
$var1=1;
function test(){
unset($GLOBALS['var1']);
}
test();
echo $var1;
结果是空的。test函数unset把外部全局变量var1卸载了