博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP语言中global和$GLOBALS[]的分析(转)
阅读量:6590 次
发布时间:2019-06-24

本文共 1052 字,大约阅读时间需要 3 分钟。

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

先看下面的例子:

执行结果为: 

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关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:

执行结果为: 

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

转载地址:http://jazio.baihongyu.com/

你可能感兴趣的文章
html5 canvas 奇怪的形状垂直渐变
查看>>
Android字体简述
查看>>
程序员快来约这些女生,保你脱单
查看>>
验证码识别--type5
查看>>
mac java环境
查看>>
U3D 垂直同步
查看>>
开源的rtsp实现
查看>>
C#异步将文本内容写入文件
查看>>
JS中setTimeout()的使用方法具体解释
查看>>
lamp 一键安装
查看>>
SQL Server 2008 收缩日志(log)文件
查看>>
UICollectionView基础
查看>>
SSAS中CUBE行权限数据级权限控制
查看>>
论文格式与参考文献格式
查看>>
pl/sql developer导出数据到excel的方法
查看>>
同态滤波
查看>>
PHP接入umeditor(百度富文本编辑器)
查看>>
Linux 安装基于(PHP5.5)memcache扩展
查看>>
How to update jQuery Mobile in Dreamweaver CS6
查看>>
CListCtrl获取列数
查看>>