原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的!
先看下面的例子:
PHP代码
- <?php
-
- 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代码
- <?php
-
- 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`数组是两个与全局变量相关的概念,它们虽然都与全局变量打交道,但在使用上有所区别。本文将继续深入分析这两个概念。 首先,`global`关键字用于在函数内部访问和操作...
总结,理解和正确使用`global`关键字以及`$GLOBALS`数组是PHP编程中重要的概念,它们在处理全局变量时提供了灵活性,但过度依赖全局变量可能会导致代码难以维护和调试。因此,建议尽量减少全局变量的使用,提高代码...
在PHP编程语言中,全局变量是可以在函数外部和内部访问的变量,但它们在函数内部默认情况下并不会自动生效。为了在函数内部使用全局变量,PHP提供了两种方式:`global`关键字和`$GLOBALS`数组。这两者虽然都与全局...
在PHP编程语言中,`$GLOBALS` 和 `global` 关键字虽然都能涉及到全局变量的使用,但它们之间存在着本质的差异。这篇文章将详细解析这两个概念的区别。 首先,`$GLOBALS` 是一个预定义的超全局变量数组,它包含了...
在PHP中,超级全局变量是一类特殊的变量,它们在整个脚本的任何作用域内都可访问,无需在函数或类的方法中使用global关键字来声明。本篇文章将深入探讨三个重要的PHP超级全局变量:$GLOBALS,$_SERVER和$_REQUEST。 ...
在多个文件中,文件一个接一个include,但最后一个文件里的函数使用global后却无法引用全局变量。例如: a.php文件: <?php $aa = 1; ?> b.php文件: <?php include a.php function show(){ global $aa; ...
本文实例讲述了PHP global全局变量的使用与注意事项。分享给大家供大家参考,具体如下: 使用global在方法里面声明外部变量为全局变量,即可以调用该变量。 示例1. global基本用法 <?php $a=1; $b=2; test_...
在PHP编程语言中,全局变量扮演着至关重要的角色,特别是在处理跨函数的数据共享时。本文将深入探讨关于全局变量的一些经验和技巧,以及如何正确地在函数内部引用它们。 首先,我们要明白一个重要的概念:全局变量...
全局变量在编程语言中扮演着重要的角色,尤其是在PHP中,它们允许你在函数或类的方法内外共享数据。在PHP中,全局变量(global)是那些在函数外部定义的变量,可以在整个脚本范围内访问,而不仅仅限于某个特定的函数...
在PHP编程语言中,`global`关键字是用来在函数或类的方法内部访问全局变量的关键字。全局变量是在函数外部定义的变量,它们在整个脚本的生命周期内都存在,可以在任何地方被引用,除非被局部作用域覆盖。理解并合理...
在PHP编程语言中,`global`关键字是用来在函数内部访问全局变量的一个重要工具。全局变量是在函数外部定义的,它们在整个脚本范围内都是可见的,而不仅仅是局限于某个函数或块。`global`关键字允许我们在函数内部...
在PHP编程语言中,常量和全局变量是两种重要的数据管理工具,它们分别适用于不同的场景。本文将深入探讨`const`定义的常量和`global`定义的全局变量,以及它们与`define()`函数和`$GLOBALS`超全局变量的区别。 首先...
在PHP编程语言中,全局变量和函数内的变量作用域是两个不同的概念。全局变量是在函数外部定义的,可以在脚本的任何地方访问,而函数内部的变量只在该函数内部有效。然而,有时我们需要在函数内部操作全局变量,这就...
在PHP编程语言中,变量的作用域是指变量在代码中的可见范围。主要分为两种类型:全局变量和局部变量。全局变量是在函数外部定义的,可以在整个脚本的任何位置访问,除非被函数内的局部变量覆盖。而局部变量则是在...
预定义变量是PHP语言提供的一组特殊的变量,它们可以在任何作用域中被访问,无需进行声明或初始化操作。预定义变量为开发者提供了方便快捷地访问某些环境变量、服务器变量等信息的能力。在本篇学习材料中,我们将...
在PHP编程语言中,变量的作用域是指变量在代码中可被访问的范围。理解变量作用域对于编写可维护和高效代码至关重要。以下是关于PHP变量作用域的一些关键知识点: 1. **全局作用域**:全局变量在整个脚本中都是有效...