PHP中global与$GLOBALS['']的区别详解

php中文网
发布: 2016-06-20 13:02:10
原创
1221人浏览过

很多人都认为global和$globals[]只是写法上面的差别,其实不然。

根据官方的解释是

$GLOBALS['var'] 是外部的全局变量$var本身。
global $var 是外部$var的同名引用。

举例说明一下:

$var1 = 1;
$var2 = 2;
function test() {
	$GLOBALS['var2'] = &$GLOBALS['var1'];
}

test();
echo $var2;
登录后复制


正常打印结果为

$var1 = 1;
$var2 = 2;

function test(){
	global $var1, $var2;
	$var2 = &$var1;
	echo $var2;
	$var2 = 'snsgou.com';
}

test(); // 输出 1
echo $var2; // 输出 2
echo $var1; // 输出 snsgou.com
登录后复制

test()函数中的$var1,$va2都是局部变量,只不过是加了global关键字后,分别引用指向全局变量$var1,$va2了,当 $var2 = &$var1; 时,局部变量$var2不再指向全局变量$val2,而重新指向全局变量$var1,换句话来说,局部变量$var2的改变,不会再影响到全局变量$val2,而会影响到重新指向的全局变量$val1。

我们再来看一个例子吧。

立即学习PHP免费学习笔记(深入)”;

$var1 = 1;
function test(){
	unset($GLOBALS['var1']);
}
test();
echo $var1;
登录后复制


因为$var1被删除了,所以什么东西都没有打印。view sourceprint?

$var1 = 1;

function test(){
	global $var1;
	unset($var1);
}

test();
echo $var1;
登录后复制


意外的打印了1。

证明删除的只是别名,$GLOBALS['var']的引用,起本身的值没有受到任何的改变。

明白了吧?

也就是说 global $var 其实就是$var = &$GLOBALS['var']。调用外部变量的一个别名而已。

+++ 探讨(二)++++++++++++++++++++++++++++++++++++++++++

PHP中global和$GLOBALS不仅仅是写法不一样以为,两者的区别还是很大的,在实际应用中需要注意!

先看下面的例子:

$id = 1;
function test() {
	global $id;
	unset($id);
}
test();
echo($id); // 输出 1
登录后复制

引用定位

许多PHP的语法结构是通过引用机制实现的,所以上述有关引用绑定的一切也都适用于这些结构。一些结构,例如引用传递和引用返回,已经在上面提到了。其它使用引用的结构有:

当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

$GLOBALS["var1"] = 1;
$var = &$GLOBALS["var1"];
unset($var);
echo $GLOBALS['var1']; //输出1
//############################################
$GLOBALS["var1"] = 1;
$var = &$GLOBALS["var1"];
unset($GLOBALS['var1']);
echo $var; //输出1
//############################################
//如果写成如下,则会出错
$GLOBALS["var"] = 1;
$var = &$GLOBALS["var"];
unset($GLOBALS['var']);
echo $var; //脚本没法执行
//###########################################
登录后复制

这意味着,例如,unset $var 不会 unset 全局变量。

unset只是把只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。

使用isset($var)的时候返回 false。$this在一个对象的方法中,$this 永远是调用它的对象的引用。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 193
查看详情 Find JSON Path Online

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。

可以通过使用 $GLOBALS 数组避免这一点。

例 在函数内引用全局变量:

$var1 = "Example variable";
$var2 = "";

function global_references($use_globals) {
	global $var1, $var2;
	if (!$use_globals) {
		$var2 = &$var1; // visible only inside the function
	} else {
		$GLOBALS["var2"] = &$var1; // visible also in global context
	}
}

global_references(false);
echo "var2 is set to '$var2'
"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'
"; // var2 is set to 'Example variable'
登录后复制

把 global $var; 当成是 $var = &$GLOBALS['var']; 的简写。所以 如果将其它引用赋给 $var, 只改变了本地变量的引用。

如前所述,引用不是指针。这意味着下面的结构不会产生预期的效果:

$bar = 3;
function foo(&$var) {
	$GLOBALS["baz"] = 5;
	$var = &$GLOBALS["baz"];
}
foo($bar);
echo $bar;//输出3
登录后复制

这将使 foo 函数中的 $var 变量在函数调用时和 $bar 绑定在一起,但接着又被重新绑定到了 $GLOBALS["baz"] 上面。

不可能通过引用机制将 $bar 在函数调用范围内绑定到别的变量上面,因为在函数 foo 中并没有变量 $bar(它被表示为 $var,但是 $var 只有变量内容而没有调用符号表中的名字到值的绑定)。可以使用引用返回来引用被函数选择的变量。

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

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

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

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

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

我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致。

$a = 1;
$b = 2;
function Sum() {
	global $a, $b;
	$b = $a + $b;
}
Sum();
echo $b;
登录后复制

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

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


相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号