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

2015-01-24信息快讯网

PHP语言中global和$GLOBALS[]的分析 之二,需要的朋友可以参考下

还是借用上一篇的例子:

PHP代码
 
<?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代码
 
<?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。
探讨fckeditor在Php中的配置详解
php创建基本身份认证站点的方法详解
编写安全 PHP应用程序的七个习惯深入分析
编写php应用程序实现摘要式身份验证的方法详解
php类常量的使用详解
深入分析php中接口与抽象类的区别
深入密码加salt原理的分析
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
探讨file_get_contents与curl效率及稳定性的分析
PHP Global变量定义当前页面的全局变量实现探讨
探讨各种PHP字符串函数的总结分析
深入探讨:Nginx 502 Bad Gateway错误的解决方法
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
如何批量替换相对地址为绝对地址(利用bat批处理实现)
PHP中全局变量global和$GLOBALS[]的区别分析
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
PHP常用技巧总结(附函数代码)
php中global和$GLOBALS[]的分析之一
PHP开发者常犯的10个MySQL错误更正剖析
PHP中全面阻止SQL注入式攻击分析小结
几种有用的变型 PHP中循环语句的用法介绍
通过PHP修改Linux或Unix口令的方法分享
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
PHP的SQL注入过程分析
php 短链接算法收集与分析
PHP中实现中文字符进制转换原理分析
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
php中全局变量global的使用演示代码
Base64在线编码解码实现代码 演示与下载
©2014-2024 dbsqp.com