php中globals,PHP中$GLOBALS和global的区别

在PHP中经常遇到$GLOBALS和global来定义和访问全局变量,那么在什么地方该用$GLOBALS,而什么地方该用global呢?这就需要我们清除了解$GLOBALS和global的区别,我也谈谈PHP中$GLOBALS和global的不同,要真正弄懂它们的区别和共同点请仔细看这篇文章。

$GLOBALS和global的本质不同

$GLOBALS和global不光有区别,还有本质不同。

$GLOBALS是一个数组,它是一个包含了全部变量的全局组合数组。而global是一个PHP关键字,它可以将一个变量的作用域变成全局的。在PHP官方手册中有这句话:

The global keyword is used to manipulate variable scope, and there is also the concept of super globals in PHP, which are special variables with a global scope.

也就是说,global声明一个变量,这个变量就具有全局作用域。比如在函数内部要访问函数外部定义的一个变量,就要用global关键字在函数内部声明这个变量。或者在函数内部声明了一个变量是global,那么在函数外部通过global声明这个变量,也就可以全局访问了。

$GLOBALS使用范例

$GLOBALS使用示例1:

function test() {

$foo = "local variable";

echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";

echo '$foo in current scope: ' . $foo . "\n";

}

$foo = "Example content";

test();

?>

在该例中,有两个$foo,一个在函数内,一个在函数外,它们的作用域不同,一个作用域是函数内的,一个作用域是全局的,这个全局指的是在这个php文件中,或者被include或require进的php文件中。我们探讨$GLOBALS和global的区别的时候,重点就是关注变量的作用域。

这个程序的输出结果是:

$foo in global scope: Example content

$foo in current scope: local variable

第一个结果是在函数内部通过$GLOBALS访问全局变量的那个$foo,可以获取并且输出。第二个结果是输出局部变量也就是函数内定义的$foo.

$GLOBALS使用示例2:

function errfunc() {

echo $PHP_SELF;

}

errfunc();

?>

本例中声明了一个变量$PHP_SELF,它的作用域是这个函数内,而直接echo这个变量会出错,因为undefined,没有定义。在PHP中,PHP_SELF这个名字应该很熟悉吧,它是自动生成的一个全局变量,表示当前网页地址。既然是自动生成的全局变量,也就可以通过$GLOBALS来访问了,如下例:

function myfunc() {

echo $GLOBALS["PHP_SELF"];

}

myfunc();

这样通过$GLOBALS访问的PHP_SELF就是全局变量中的,而这个变量很特殊,是系统自动生成的。

global使用示例

global使用示例1

$name='Steve';

function myname(){

global $name;

echo $name;

}

myname();

?>

$name='Steve';

function myname(){

global $name;

echo $name;

}

myname();

?>

这个简单的例子就是在函数内部访问外部全局变量$name然后输出它,如果不用global就会出错。

global使用示例2

function myfunc() {

global $PHP_SELF;

echo $PHP_SELF;

}

myfunc();

?>

function myfunc() {

global $PHP_SELF;

echo $PHP_SELF;

}

myfunc();

?>

和上面的例子作用一样,输出PHP_SELF全局变量。这里用的global,把一个变量作用域变成全局的,这就是global和$GLOBALS的共同点。这里global声明了一个变量$PHP_SELF,就创建了外部变量$PHP_SELF的同名引用或指针,从而访问全局变量,这句话又是讲的global和$GLOBALS的不同点。

通过下面的例子就可以看出global和$GLOBALS的区别:

$var1=1;

$var2=2;

function test(){

global $var1,$var2;

$var2=&$var1;

}

test();

echo $var2;

1

2

3

4

5

6

7

8

$var1=1;

$var2=2;

function test(){

global $var1,$var2;

$var2=&$var1;

}

test();

echo $var2;

结果是:2

为什么结果是2?首先通过global将外部变量$var1,$var2变成全局变量,然后$var2引用$var1,很多人就理解为$var2的值和$var1一样了,但是echo $var2是在函数外部,global是在函数内部创建了外部$var2的同名引用,并不是外部$var2本身,所以函数内部的操作并没有改变外部变量$var2的值。

如果用$GLOBALS,如下例那就改变了$var2的值:

$var1=1;

$var2=2;

function test(){

$GLOBALS['var2']=&$GLOBALS['var1'];

}

test();

echo $var2;

$var1=1;

$var2=2;

function test(){

$GLOBALS['var2']=&$GLOBALS['var1'];

}

test();

echo $var2;

结果是1。因为$GLOBALS变量是自己本身。

再如这个例子证明$GLOBALS[‘var’]是自己本身。

$var1=1;

function test(){

unset($GLOBALS['var1']);

}

test();

echo $var1;

1

2

3

4

5

6

$var1=1;

function test(){

unset($GLOBALS['var1']);

}

test();

echo $var1;

结果是空的。test函数unset把外部全局变量var1卸载了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值