php globals 优缺点,php中global 与 $GLOBALS[“”] 区别(差异)(总结)

php中global 与 $GLOBALS[“”] 区别(差异)

原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的!

先看下面的例子:

PHP代码

1. <?PHP

2. // 例子1

3. function test_global() {

4. global $var1, $var2;

5. $var2 =&

$var1;

6. }

7. function test_globals() {

8. $GLOBALS['var3']

=& $GLOBALS['var1'];

9. }

10. $var1 = 5;

11. $var2 = $var3 = 0;

12. test_global();

13. print $var2 ."n";

14. test_globals();

15. print $var3 ."n";

16. ?>

执行结果为:

0

5

怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?

恩,我们保留以上问题,深入分析$GLOBALS和global的原理!

我们都知道变量其实是相应物理内存在代码中的"代号",假设我们上面声明的3个变量分配的内存如下图表示:

引用PHP手册的$GLOBALS的解释:

Global 变量:$GLOBALS

注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。

由所有已定义全局变量组成的数组。变量名就是该数组的索引。

这是一个“superglobal”,或者可以描述为自动全局变量。

也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!

下面来分析global到底做了什么?

我们都知道PHP中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:

PHP代码

1. <?PHP

2. // 例子2

3. function test() {

4. global $a;

5. unset($a);

6. }

7.

8. $a = 1;

9. test();

10. print $a;

11. ?>

复制代码

执行结果为:

1

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?PHP的bug?

都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入

print $a;

复制代码

来测试!也就是说global产生了test函数外部$a的别名变量“$a”,为了和外面的$a区别,我把它成为--test->$a,那么例子1也这么命名的话,可得出下面的图:

接着回到上面的例子1,看test_global中的这一代码“$var2 =&

$var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化由下图可以看出:

[没有图,谢谢,忽悠你的]

而test_globals执行过以后,看变量的变化:

此时,看图,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!

所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:

global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,例如例子1.

$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致!

可以对照下面两个列子:

global:

function myfunction(){

global

$bar;

unset($bar);

}

$bar="someting";

myfunction();

echo $bar;

?>

输出:someting

$global[]:

function

foo()

{

unset($GLOBALS['bar']);

}

$bar = "something";

foo();

echo $bar;

?>

输出:空

PHP 的全局变量和 C 语言有一点点不同,在 C

语言中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能漫不经心的改变一个全局变量。PHP

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

使用 global的例子

$a = 1;

$b = 2;

function Sum()

{

global $a, $b;

$b = $a + $b;

}

Sum();

echo $b;

?> 以上脚本的输出将是 "3"。在函数中申明了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值