background image

复制代码
履行效果为:
1
为什么会输出 1 呢?不是已经把$a 给 unset 了吗?unset 失灵了?PHP 的 bug?
都不是,其实 unset 起作用了,是把 test 函数中的$a 给 unset 掉了,可以在函数后面参加
print $a;
也就是说 global

 

产生 了 test 函数外部$a

 

的别名 变量 $a”,为了和外面的$a 差别

接着回到上面的例子 1,看 test_global

中的这一代码 $var2 =& $var1;”,上面是一个引用

赋值运算,也就是$var2 将指向 var1 所指向的物理内存地址
所以我们得出一个结论,在函数中 global 和$GLOBALS[]的差别在于:
global

 

 

在函数产生 一个指向函数外部变量的别名 变量,而不是真正的函数外部变量,一

 

 

但转变了别名 变量的指向地址,就会产生一些意料不到情况 ,例如例子 1.
$GLOBALS[]确确凿实调用是外部的变量,函数内外会始终维持一致!

 

可以对照 下面两个列子:
global:
<?php
function myfunction(){
    global $bar;
    unset($bar);
}
$bar="someting";
myfunction();
echo $bar;
?>
输出:someting
$global[]:
<?php
    function foo()
{
    unset($GLOBALS['bar']);
}
$bar = "something";
foo();
echo $bar;
?>
输出:空
PHP 

 

的全局变量和 C 

 

语言有一点点不同,在 C 语言中,全局变量在函数中主动生效,除

非被局部变量笼罩。这可能引起一些问题,有些人可能漫不经心的转变一个全局变量 。
PHP 

 

 

中全局变量在函数中应用时必须 申明 为全局。
 

应用 global 的例子
<?php
$a = 1;
$b = 2;