`

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

    博客分类:
  • PHP
PHP 
阅读更多

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

PHP代码
  1. <?php  
  2. // 例子1  
  3. function test_global() {  
  4.   global $var1$var2;  
  5.   $var2 =& $var1;  
  6. }  
  7. function test_globals() {  
  8.   $GLOBALS['var3'] =& $GLOBALS['var1'];  
  9. }  
  10. $var1 = 5;  
  11. $var2 = $var3 = 0;  
  12. test_global();  
  13. print $var2 ."\n";  
  14. test_globals();  
  15. print $var3 ."\n";  
  16. ?>   

执行结果为:
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代码
  1. <?php  
  2. // 例子2  
  3. function test() {  
  4.   global $a;  
  5.   unset($a);  
  6. }  
  7.   
  8. $a = 1;  
  9. test();  
  10. print $a;  
  11. ?>   

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

分享到:
评论

相关推荐

    全局变量中$GLOBALS['']和global的区别

    在PHP编程语言中,全局变量是可以在脚本的任何位置访问的变量,它们不局限于函数或类的方法内部。然而,当我们需要在函数内部使用全局变量时,有两种方式可以实现:`global`关键字和`$GLOBALS`数组。虽然两者都能...

    PHP语言中global和$GLOBALS[]的分析 之二

    在PHP编程语言中,`global`关键字和`$GLOBALS`数组是两个与全局变量相关的概念,它们虽然都与全局变量打交道,但在使用上有所区别。本文将继续深入分析这两个概念。 首先,`global`关键字用于在函数内部访问和操作...

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

    总结,理解和正确使用`global`关键字以及`$GLOBALS`数组是PHP编程中重要的概念,它们在处理全局变量时提供了灵活性,但过度依赖全局变量可能会导致代码难以维护和调试。因此,建议尽量减少全局变量的使用,提高代码...

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

    在PHP编程语言中,全局变量是可以在函数外部和内部访问的变量,但它们在函数内部默认情况下并不会自动生效。为了在函数内部使用全局变量,PHP提供了两种方式:`global`关键字和`$GLOBALS`数组。这两者虽然都与全局...

    PHP中$GLOBALS与global的区别详解

    在PHP编程语言中,`$GLOBALS` 和 `global` 关键字虽然都能涉及到全局变量的使用,但它们之间存在着本质的差异。这篇文章将详细解析这两个概念的区别。 首先,`$GLOBALS` 是一个预定义的超全局变量数组,它包含了...

    PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析

    在PHP中,超级全局变量是一类特殊的变量,它们在整个脚本的任何作用域内都可访问,无需在函数或类的方法中使用global关键字来声明。本篇文章将深入探讨三个重要的PHP超级全局变量:$GLOBALS,$_SERVER和$_REQUEST。 ...

    php多次include后导致全局变量global失效的解决方法

    在多个文件中,文件一个接一个include,但最后一个文件里的函数使用global后却无法引用全局变量。例如: a.php文件: &lt;?php $aa = 1; ?&gt; b.php文件: &lt;?php include a.php function show(){ global $aa; ...

    PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】 原创

    本文实例讲述了PHP global全局变量的使用与注意事项。分享给大家供大家参考,具体如下: 使用global在方法里面声明外部变量为全局变量,即可以调用该变量。 示例1. global基本用法 &lt;?php $a=1; $b=2; test_...

    PHP程序设计-3期(KC016) 经验技巧2-3 全局变量.doc

    在PHP编程语言中,全局变量扮演着至关重要的角色,特别是在处理跨函数的数据共享时。本文将深入探讨关于全局变量的一些经验和技巧,以及如何正确地在函数内部引用它们。 首先,我们要明白一个重要的概念:全局变量...

    php中全局变量global的使用演示代码

    全局变量在编程语言中扮演着重要的角色,尤其是在PHP中,它们允许你在函数或类的方法内外共享数据。在PHP中,全局变量(global)是那些在函数外部定义的变量,可以在整个脚本范围内访问,而不仅仅限于某个特定的函数...

    php代码-global

    在PHP编程语言中,`global`关键字是用来在函数或类的方法内部访问全局变量的关键字。全局变量是在函数外部定义的变量,它们在整个脚本的生命周期内都存在,可以在任何地方被引用,除非被局部作用域覆盖。理解并合理...

    php代码-PHP global 关键字

    在PHP编程语言中,`global`关键字是用来在函数内部访问全局变量的一个重要工具。全局变量是在函数外部定义的,它们在整个脚本范围内都是可见的,而不仅仅是局限于某个函数或块。`global`关键字允许我们在函数内部...

    PHP const定义常量及global定义全局常量实例解析

    在PHP编程语言中,常量和全局变量是两种重要的数据管理工具,它们分别适用于不同的场景。本文将深入探讨`const`定义的常量和`global`定义的全局变量,以及它们与`define()`函数和`$GLOBALS`超全局变量的区别。 首先...

    PHP中函数内引用全局变量的方法

    在PHP编程语言中,全局变量和函数内的变量作用域是两个不同的概念。全局变量是在函数外部定义的,可以在脚本的任何地方访问,而函数内部的变量只在该函数内部有效。然而,有时我们需要在函数内部操作全局变量,这就...

    PHP变量作用域(全局变量&局部变量)&global&static关键字用法实例分析

    在PHP编程语言中,变量的作用域是指变量在代码中的可见范围。主要分为两种类型:全局变量和局部变量。全局变量是在函数外部定义的,可以在整个脚本的任何位置访问,除非被函数内的局部变量覆盖。而局部变量则是在...

    PHP学习之预定义变量(实例讲解)

    预定义变量是PHP语言提供的一组特殊的变量,它们可以在任何作用域中被访问,无需进行声明或初始化操作。预定义变量为开发者提供了方便快捷地访问某些环境变量、服务器变量等信息的能力。在本篇学习材料中,我们将...

    浅析php变量作用域的一些问题

    在PHP编程语言中,变量的作用域是指变量在代码中可被访问的范围。理解变量作用域对于编写可维护和高效代码至关重要。以下是关于PHP变量作用域的一些关键知识点: 1. **全局作用域**:全局变量在整个脚本中都是有效...

Global site tag (gtag.js) - Google Analytics