新浪PHP开发工程师笔/面试总结二·全局变量

PHP的官方文档里有这样一篇文章,很详细地说明了global关键字、$GLOBALS数组和static关键字的问题。其中关于全局变量的讨论:

总结如下:

  • global关键字建立了局部变量和全局变量的引用,从而可以在局部函数里操作全局变量。
  • GLOBALS数组是一个超全局变量,是“在全部作用域中始终可用的内置变量”。在全局声明的所有函数都会自动出现在GLOBALS数组中。
  • global关键字的效果会被新的新建引用语句”=&”覆盖。
  • 特别地,global的应用范围是“顶层”而不是更高一层。(全局变量里的note里提到的)

吐槽一下wp-markdown好难用…分隔线和前面的序号老是混在一起…

那么下面就来具体讨论一下PHP中的全局变量的用法:

在PHP中,用户自定义函数中会产生一个局部变量区域,因此函数内的变量缺省只在函数内生效。global关键字和$GLOBALS数组的出现大概就是为了解决全局变量在局部变量区域内的引用问题而出现的。

例如

1
2
3
4
5
$a=1;
function Test(){
echo $a;//这里的$a引用了一个 原来不存在的 后来函数自己声明的 局部$a
}
Test();

不会有任何输出。


1
2
3
4
5
6
function Test(){
global $a;
echo $a;
echo $GLOBALS['a'];
}
Test();

则都会有输出。

而且还有一种有趣的现象,即函数内部新声明的全局变量也可以在函数外部调用。不知道怎么用比较严谨的说法表示了,就直接举例吧:

1
2
3
4
5
6
function declare(){
global $not;
$not =5;
}
declare();
echo $not;//此处输出5

即使在函数外部从来没有声明过$not变量,但是只要在函数内添加了global关键字,就可以在函数外调用了。

关于global和$GLOBALS的区别,在官方文档的“变量范围”里讲得不是很清楚,但是在“引用做什么”里的一句话感觉做了很好的总结:

把global $var;当成是$var=&GLOBALS[‘var’];的简写,从而将其他引用赋给$var只改变了本地变量的引用。

可以写一个函数验证一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function vartest(){
global $var1,$var2;
$var1 = $var2 = 1;
$var1 =& $GLOBALS['var2'];
$var1 = 2;
echo "local \$var1 = $var1\n";//此处输出2
echo "local \$var2 = $var2\n";//此处输出2
}
vartest();
echo "global \$var1 = $var1\n";//此处输出1
echo "global \$var2 = $var2\n";//此处输出2

function globaltest(){
$var3 =& $GLOBALS['var3'];
$var3 = 5;
}
echo "global \$var3 = $var3\n";//此处没有输出

实际操作时发现:

  • global关键字改变是局部变量的引用;
  • 这个引用可以通过建立新的引用覆盖;
  • global关键字和新建引用语句并不完全相同,未经global关键字声明的函数不能被函数外调用。