search
HomeBackend DevelopmentPHP TutorialPHP中global与$GLOBALS['']的区别详解

很多人都认为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。

我们再来看一个例子吧。

$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 永远是调用它的对象的引用。

如果在一个函数内部给一个声明为 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。


Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft