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。
分享到:
相关推荐
在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. **全局作用域**:全局变量在整个脚本中都是有效...