PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖
 
 
这可能引起一些问题,有些人可能漫不经心的改变一个全局变量。PHP 中全局变量在函数中使用时必须申明为全局(注意,Global这个关键字在函数中定义才有用)。 
1:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。

复制代码代码如下:
<?PHP 
$a=123; 
function aa() 

Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a,此时这个变量是局部变量,等同于C语言的局部变量,只能在函数体内部使用。 
echo $a; 

aa(); 
?> 

总结:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,

复制代码代码如下:
$global $a; 
$a=123; 
function f() 

echo $a; //错误, 

//再看看下面一例 
function f() 

global $a; 
$a=123; 

f(); 
echo $a; //正确,可以使用 

2:global问题解析: 
question:我在 config.inc.php中定义了一些变量($a),在别的文件中函数外部 include("config.inc.php"),函数内部需要使用这些变量$a,如果没有声明的话,echo $a是打印不出来任何东西的。因此声明global $a,但是有很多函数和很多变量,总不能不断重复的这样声明吧?有什么好的解决办法,请指点。 
answer1:先在config.inc.php里定义常量:define(常量名,常量值) 
再在其他需要用到的地方require 'config.inc.php', 
然后就能在这个文件里直接使用这个常量了。 
answer2:我也有个办法,就是定义数组,如$x[a],$x,那样就只要声明global $x一个了。 
answer3:我试了你的这个方法,不行啊。 
answer4:改你的php.ini文件。 
3.一些Global和$GLOBALS 数组的例子

例子:使用 global

复制代码代码如下:
<?PHP 
$w3sky = 1; 
$w3sky2 = 2; 
function Sum() 

global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2; 
}Sum(); 
echo $w3sky2; 
?> 

以上脚本的输出将是“3”。在函数中申明了全局变量 $w3sky 和 $w3sky2,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够申明的全局变量的最大个数,PHP 没有限制。 
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子可以写成: 
例子 使用 $GLOBALS 替代 global

复制代码代码如下:
<?PHP 
$w3sky = 1; 
$w3sky2 = 2;function Sum() 

$GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2']; 
}Sum(); 
echo $w3sky2; 
?> 

在 $GLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显示了超全局变量的用处: 
例子 演示超全局变量和作用域的例子

复制代码代码如下:
<?PHP 
function test_global() 

// 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。 
global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。 
echo $_POST['name']; 

?> 

global 也就是说在一个文件里 只要你声明为global $db 那么在声明的下面 你就可以引用这个$db了。 
4.原来以为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"; 
?> 

复制代码 
执行结果为: 


怎么会这样呢?不应该是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 
// 例子2 
function test() { 
global $a; 
unset($a); 

$a = 1; 
test(); 
print $a; 
?> 

复制代码 
执行结果为: 

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug? 
都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入 
print $a; 
复制代码 
来测试!也就是说global产生了test函数外部$a的别名变量“$a”,为了和外面的$a区别,我把它成为--test->$a,那么例子1也这么命名的话,可得出下面的图: 
而test_globals执行过以后,看变量的变化: 
此时,看图,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了! 
所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于: 
global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况(为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。这时候只是指向$var1的指针指向了$var2的指针,只是指针指向变了一下,但是实质上根本就没有改变$var2的值,因此$var2的值仍旧不会变化),例如例子1. 
$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致! 
注:(接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.(重点) 
接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化由下图可以看出)
这一篇分析的不够透彻,不明白的请看《global和$GLOBALS[]的分析之二》其中举一反三通俗易懂

(转)php中global和$GLOBALS[]的分析之一的更多相关文章

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

    PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖       这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数 ...

  2. php中global与$GLOBALS的用法及区别-转载

    php中global 与 $GLOBALS[""] 差别 原本觉得global和$GLOBALS除了写法不一样觉得,其他都一样,可是在实际利用中发现2者的差别还是很大的! 先看下面 ...

  3. php中global与$GLOBALS的用法及区别

    php中global 与 $GLOBALS[""] 差别 原本觉得global和$GLOBALS除了写法不一样觉得,其他都一样,可是在实际利用中发现2者的差别还是很大的! 先看下面 ...

  4. PHP中global与$GLOBALS['']的区别

    +++ 探讨(一)+++++++++++++++++++++++++++++++++++++++ 很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然. 根据官方的解释是 $GL ...

  5. PHP中global与$GLOBALS的区别

    单一个global是一个关键字,通常附加在变量前,用于将变量声明至全局作用域: $GLOBALS是预定义的超全局变量,把变量扔到里边的话一样可以带到全局去. $GLOBALS 是一个关联数组,每一个变 ...

  6. php中global和$GLOBALS最浅显易懂的解释

    官方文档: global指对变量的引用或者叫指针,$GLOBALS则是变量本身: $var1 = 1; $var2 = 2; function fun(){ $GLOBALS['var2'] = &a ...

  7. php 中 global 与 $GLOBAL 由引用产生的区别

    很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然. 根据官方的解释是 $GLOBALS['var'] 是外部的全局变量$var本身. global $var 是外部$var的 ...

  8. PHP中超全局变量$GLOBALS和global的区别

    一.超全局变量$GLOBALS PHP超全局变量有很多,如下的都属于超全局变量(Superglobal): $GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKI ...

  9. PHP中全局变量的使用global和$GLOBALS[]

    From: http://blog.csdn.net/happyqyt/article/details/7219889 用PHP开发项目,不可避免的会使用到全局变量,比如一些网站的配置信息,全站通用, ...

随机推荐

  1. [BestCoder Round#26] Apple 【组合数学】

    题目链接:HDOJ - 5160 题目分析 第一眼看上去,要求统计所有不同排列对答案的贡献.嗯...完全没有想法. 但是,如果我们对每个数字单独考虑,计算这个数字在总答案中的贡献,就容易多了. 对于一 ...

  2. vss报错Workgroup无法访问,您可能没有权限使用网络资源解决办法

    xp下访问svn或者vss的时候只能使用ip进行访问表示很不爽,昨天还好好的,结果就不能使用计算机名字去访问了. 很是郁闷,打开网上邻居之后发现,居然连网上邻居都搜不出来,于是关掉windows自带防 ...

  3. [转]Windows Azure上安装SharePoint 2013

    基于Windows Azure 安装SharePoint 2013 前段时间写的基于Windows Azure安装SharePoint系列,由于Azure的体验账号过期了,所以不得不暂停.今天有幸参加 ...

  4. COJ 2108 Day7-例1

    Day7-例1 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述   在计算机中,CPU只能和高速缓存Cache直接交换数据.当 ...

  5. 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  6. [Locked] Group Shifted Strings

    Group Shifted Strings Given a string, we can "shift" each of its letter to its successive ...

  7. ubuntu12编译openwrt

    搭建编译环境 Ubuntu x64 12.04下的命令: sudo apt-get install subversion sudo apt-get install git sudo apt-get i ...

  8. java MessageFormat 应用 和 疑惑

    先来个demo String string = "{0}\"{1}\""; System.out.println(MessageFormat.format(st ...

  9. jSP的3种方式实现radio ,checkBox,select的默认选择值。

    jSP的3种方式实现radio ,checkBox,select的默认选择值.以radiao 为例:第一种方式:在jsp中使用java 脚本,这个方法最直接,不过脚本太多,不容易维护<%Stri ...

  10. readlink

    readlink命令 标签: ubuntulinux工具file 2012-03-15 14:06 3674人阅读 评论(1) 收藏 举报  分类: linux系统(184)  C语言(92)  re ...