复制代码
履行效果为:
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;