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

<?php  // 例子1  function test_global() {  global $var1, $var2;  $var2 =& $var1;  }  function test_globals() {  $GLOBALS['var3'] =& $GLOBALS['var1'];  }  $var1 = 5;  $var2 = $var3 = 0;  test_global();  print $var2 ."\n";  test_globals();  print $var3 ."\n";  ?> 

执行结果为: 
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  // 例子2  function test() {  global $a;  unset($a);  }  

$a = 1;  test();  print $a;  ?> 

执行结果为: 
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[]确确实实调用是外部的变量,函数内外会始终保持一致!

PHP语言中global和$GLOBALS[]的分析(转)相关推荐

  1. PHP语言中global和$GLOBALS[]的分析

    2019独角兽企业重金招聘Python工程师标准>>> 网站建设原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的! 先 ...

  2. Php global echo,php中global和$GLOBALS[]的分析之一

    PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖 这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数中使用时必须 ...

  3. php中global和$GLOBALS[]的分析之一

    PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖 这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数中使用时必须 ...

  4. c语言中sizeof是一个标准库函数,对C语言中的sizeof的介绍分析

    对C语言中的sizeof的介绍分析 引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是百分网小编分享给大家的对C语言中的sizeof的介绍分析,欢迎阅读! 1.定义 sizeof是C ...

  5. c语言中变量加1,c语言中,指针加1的情况.指针变量详细介绍

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型, 指针所指向的 类型, 指针的值或者叫指针所指向的内存区, 还有指针本身所占 ...

  6. c语言中用两个n表示什么格式,C语言中‘\n'为什么能表示CRLF两个字节

    为什么要说这个简单的问题? 众所周知,在Windows下文本文件的换行符是CRLF,占两个字节.在Unix下是LF,占一个字节.(还有奇葩的Mac是CR).但是C语言中直接printf一个 '\n', ...

  7. c语言atan的作用,C语言中的atan和atan2

    在C语言的math.h或C++中的cmath中有两个求反正切的函数atan(double x)与atan2(double y,double x)  他们返回的值是弧度 要转化为角度再自己处理下. 前者 ...

  8. exit在c语言里的作用,C语言中exit函数的使用

    exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调 ...

  9. PHP中全局变量global和$GLOBALS[]的区别分析

    一.举例比较  例一: <?php  $var1 = 1;  function test(){  unset($GLOBALS['var1']);  }  test();  echo $var1 ...

最新文章

  1. hibernate-session中的方法
  2. MySQL存储过程简介
  3. Redis集群搭建笔记
  4. 尼康d7200拍照_为什么尼康和佳能的全画幅旗舰单反却只有2000多万像素?
  5. Pytorch中的Batch Normalization操作
  6. 手机必备OCR文字识别软件:福昕扫描王使用攻略
  7. Android编译环境——VMware虚拟机安装配置
  8. 攀枝花学院计算机专业单身率,重磅 | 攀枝花学院2018届毕业生就业质量年度报告...
  9. Java中对象和类(main主类简介)
  10. yolo v3 pytorch版本(转载)
  11. C# 如何提取PDF文本和图片
  12. Hive 核心原理(hive-3.1.2)
  13. Thrift 入门教程【转】
  14. [透视变换]象棋棋盘矫正Python&OpenCV
  15. SIM900A通过基站定位
  16. 【计算机网络】网络层:路由器的构成
  17. 【网络】IP地址计算
  18. 为了证明苹果电脑会不会中毒,我把病毒拷了进去
  19. 大型IT系统性能测试入门经典-系统性能测试基础
  20. TPS54060/260调试记录

热门文章

  1. 管理数据,应用程序和主机安全-A
  2. RTLviewer与TechnologyMapViewer的区别?
  3. VMware 下安装centos7,无法进入图形化界面
  4. 要不要使用外键(foreign key )?
  5. PPC莫名死机,上周末为此hard reset了两次重装,这几天又历史重演,今天再次硬复位。想我那个Palm TT...
  6. Monte Carlo Rendering De-noising
  7. 技术在大数据分析中的重要性
  8. 大数据可视化平台可以实现什么功能
  9. html 并集选择器,HTML+CSS基础 并集选择器
  10. python 构造函数传参_C++和python混合编程之在python类构造函数中传参方法