浅析global与$GLOBALS的区别

前两天看到一道关于global与$GLOBALS的面试题,觉得挺有趣,废话不多说,直接上代码(在简书编辑器上手打代码太凌乱了,所以就贴图啦~\(≧▽≦)/~):

      相信大家看完代码,都一定会有自己的答案,我在看完代码之后,斩钉截铁、毫不犹豫、毅然决然地表示,输出结果是55,骨感的现实告诉我,我还是 too young too simple,正确的答案其实是05,这道题其实就是考察global与$GLOBALS之间的区别,下面进行一下分析:

      我们首先来看一个例子(抱歉,又贴图啦)

执行结果为:a,我就纳闷了,不是unset了吗,怎么还输出a呀,难道unset失效?我们在demo函数中,echo $a看一下,unset是否生效。

执行结果为:Notice: Undefined variable: a in G:\wamp\www\test.php on line8unset是生效的,这说明,demo中的$a与函数外的$a,其实是不一样的。经过查询PHP文档得知,函数内global的变量与函数外的全局变量,其实是不一样的变量,既然是不一样的变量,我们为了描述方便,分别给它们取不同的名字:demo->$a(函数内global的变量),$a(全局变量),demo->$a和$a指向的是同一个物理内存地址,当unset demo->$a时,对$a是没有影响的,$a还是指向那个内存地址,内存地址存放的值,还是之前的字符串a。当我们把demo函数中的 global $a替换成$GLOBALS['a']时,如下

执行结果为:Notice: Undefined variable: a in G:\wamp\www\test.php on line10,说明$GLOBALS['a']与函数外的$a就是同一个变量,不是双胞胎,不是亲兄弟,他就是同一个人呀!!!~~~,所以在函数中unset,函数外就直接报错了。总结一下:函数内global和全局变量其实还是两个不一样的变量,只是两个变量之间是引用关系(推了推黑框眼镜),而$GLOBALS['a']和全局变量$a,就是同一个变量。有了这个结论,我们再来看上面的面试题,就豁然开朗啦(为了大家不用再倒回去看代码,此处再贴一次代码)

test_global函数中,用的是global,所以test_global->$var1, $var2(global $var1, $var2)和函数外的$var1, $var2其实是不同的变量,只是存在引用关系。test_global函数中,改变的只是test_global->$var1, $var2(global $var1, $var2)的指向关系,并不影响函数外的$var1, $var2的指向,所以第一个输出是0。test_globals函数,用的是$GLOBALS['var3'],上文已经说过,$GLOBALS['var3']和$var3就是同一个变量,那改变了$GLOBALS['var3']的指向,就是改变$var3的指向了嘛,所以,第二个输出就是5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、php可以做什么 php是一种可以在服务器端运行的编程语言,可以运行在Web服务器端。 php是一门后台编程语...
    空谷悠阅读 3,133评论 4 97
  • 一、数组 1、数组定义 数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西。 $...
    空谷悠阅读 814评论 4 11
  • Shell 初识 一、程序 1、什么是程序 程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。...
    kobe_liu阅读 385评论 0 0
  • 在网上偶然看到一道题 在我的猜想之中输出应该是1,而不是2。官方给出的说法是:$GLOBALS['var']是外部...
    415b121ad7bf阅读 258评论 0 0
  • 首先,部分内容得转载下: 原文链接:https://www.runoob.com/python3/python3-...
    抱紧微软阅读 696评论 0 2