PHP语言中global和$GLOBALS[]的分析(转)
原来以为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[]的分析(转)相关推荐
- PHP语言中global和$GLOBALS[]的分析
2019独角兽企业重金招聘Python工程师标准>>> 网站建设原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的! 先 ...
- Php global echo,php中global和$GLOBALS[]的分析之一
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖 这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数中使用时必须 ...
- php中global和$GLOBALS[]的分析之一
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖 这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数中使用时必须 ...
- c语言中sizeof是一个标准库函数,对C语言中的sizeof的介绍分析
对C语言中的sizeof的介绍分析 引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是百分网小编分享给大家的对C语言中的sizeof的介绍分析,欢迎阅读! 1.定义 sizeof是C ...
- c语言中变量加1,c语言中,指针加1的情况.指针变量详细介绍
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型, 指针所指向的 类型, 指针的值或者叫指针所指向的内存区, 还有指针本身所占 ...
- c语言中用两个n表示什么格式,C语言中‘\n'为什么能表示CRLF两个字节
为什么要说这个简单的问题? 众所周知,在Windows下文本文件的换行符是CRLF,占两个字节.在Unix下是LF,占一个字节.(还有奇葩的Mac是CR).但是C语言中直接printf一个 '\n', ...
- c语言atan的作用,C语言中的atan和atan2
在C语言的math.h或C++中的cmath中有两个求反正切的函数atan(double x)与atan2(double y,double x) 他们返回的值是弧度 要转化为角度再自己处理下. 前者 ...
- exit在c语言里的作用,C语言中exit函数的使用
exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调 ...
- PHP中全局变量global和$GLOBALS[]的区别分析
一.举例比较 例一: <?php $var1 = 1; function test(){ unset($GLOBALS['var1']); } test(); echo $var1 ...
最新文章
- hibernate-session中的方法
- MySQL存储过程简介
- Redis集群搭建笔记
- 尼康d7200拍照_为什么尼康和佳能的全画幅旗舰单反却只有2000多万像素?
- Pytorch中的Batch Normalization操作
- 手机必备OCR文字识别软件:福昕扫描王使用攻略
- Android编译环境——VMware虚拟机安装配置
- 攀枝花学院计算机专业单身率,重磅 | 攀枝花学院2018届毕业生就业质量年度报告...
- Java中对象和类(main主类简介)
- yolo v3 pytorch版本(转载)
- C# 如何提取PDF文本和图片
- Hive 核心原理(hive-3.1.2)
- Thrift 入门教程【转】
- [透视变换]象棋棋盘矫正Python&OpenCV
- SIM900A通过基站定位
- 【计算机网络】网络层:路由器的构成
- 【网络】IP地址计算
- 为了证明苹果电脑会不会中毒,我把病毒拷了进去
- 大型IT系统性能测试入门经典-系统性能测试基础
- TPS54060/260调试记录
热门文章
- 管理数据,应用程序和主机安全-A
- RTLviewer与TechnologyMapViewer的区别?
- VMware 下安装centos7,无法进入图形化界面
- 要不要使用外键(foreign key )?
- PPC莫名死机,上周末为此hard reset了两次重装,这几天又历史重演,今天再次硬复位。想我那个Palm TT...
- Monte Carlo Rendering De-noising
- 技术在大数据分析中的重要性
- 大数据可视化平台可以实现什么功能
- html 并集选择器,HTML+CSS基础 并集选择器
- python 构造函数传参_C++和python混合编程之在python类构造函数中传参方法