`
再逢山水
  • 浏览: 156346 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • LAMP
PHP 
阅读更多
php中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的原理!


我们都知道变量其实是相应物理内存在代码中的”代号”而已


引用php手册的$GLOBALS的解释:


引用
Global 变量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。


由所有已定义全局变量组成的数组。变量名就是该数组的索引。这是一个“superglobal”,或者可以描述为自动全局变量。


也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!


下面来分析global到底做了什么?


引用php手册的global的解释:


引用
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。


我们都知道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掉了,可以在函数test()中加入


print $a;

来测试!

接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.


此时,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!


所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:


global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,例如例子 1.


$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致


可以对照 下面两个列子再加深下印象:


global:


<?php

function myfunction(){

    global $bar;

    unset($bar);
}

$bar=”someting”;

myfunction();

echo $bar;
?>


输出:someting

$GLOBALS[]:

<?php

function foo()
{
    unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;

?>


输出:空


当按照上面的思路理解后,碰到下面的情况是不是又有些晕呢?
<?php
$a = 1;
$b = 2;

function Sum()
{
   global $a, $b;

   $b = $a + $b;
}
Sum();
echo $b;
?>


输出将是 “3″。在函数中申明 了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。


怎么不是2呢,在函数外部不是不影响吗,请注意$b在函数中并没有通过引用修改,而是修改的$b指向物理内存的值,因此外部输入为3。
分享到:
评论

相关推荐

    全局变量中$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