PHP 用户自定义函数中的变量在默认状态下为局部变量,即其变量只在函数内部生效。
示例1:
<?php
$name='Amy';
function change_name(){
$name='Baby';
}
change_name();
echo 'My name is '.$name.'.<br/>'; //My name is Amy.
?>
那么,如果想让函数内的变量在函数外部有效,我们就需要将其设置为全局变量。PHP 中有两种方式可以使全局变量在函数中可用:一种是使用 global 声明变量,另一种是使用超全局变量 $GLOBALS 。
一、使用 global 关键字
示例2(无效方式):
<?php
global $name;
$name='Amy';
function change_name(){
$name='Baby';
}
change_name();
echo 'My name is '.$name.'.<br/>'; //My name is Amy.
?>
注意!从示例2中可以看到,在函数外将变量声明为全局的并没有影响到函数内的变量。那么,怎么样才是正确的方式呢?
示例3(正确方式):
<?php
$name='Amy';
function change_name(){
global $name;
$name='Baby';
}
change_name();
echo 'My name is '.$name.'.<br/>'; //My name is Baby.
?>
从示例3中可以看到,在函数中将变量声明为 global 使我们得到了期望的结果,这就是通过 global 使全局变量在函数中可用的正确方式。
二、使用超全局变量 $GLOBALS
除了使用 global 关键字定义外,还可以使用超全局变量 $GLOBALS 。$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。它在一个脚本的全部作用域中都可用。
示例4:
<?php
$name='Amy';
function change_name(){
$GLOBALS['name']='Baby';
}
change_name();
echo 'My name is '.$name.'.<br/>'; //My name is Baby.
?>
三、global 和 $GLOBALS 的区别
示例5:
<?php
$var1=1;
$var2=2;
function test1(){
$GLOBALS['var2']=&$GLOBALS['var1'];
}
test1();
echo $var2.'<br/>'; //1
$var3=1;
$var4=2;
function test2(){
global $var3,$var4;
$var4=&$var3;
}
test2();
echo $var4; //2
?>
从示例5中可以看到,使用引用变量时,$GLOBALS 和 global 的处理结果并不一致。对此,官方说明是:$GLOBALS[‘var’] 是外部的全局变量本身,而 global $var 是外部 $var 的同名引用或者指针。由此便可解释:示例5中函数 test2() 中的 $var4 原本是对函数外 $var4 的引用,而函数内执行 $var4=&$var3 之后,函数内的 $var4 不再与函数外的 $var4 指向同一个内存空间,因而函数外的 $var4 值不变。我们再来看另一个例子——
示例6:
<?php
$var1=1;
function test1(){
unset($GLOBALS['var1']);
}
test1();
var_dump($var1); //NULL
$var2=1;
function test2(){
global $var2;
unset($var2);
}
test2();
echo $var2; //1
?>
在 PHP引用变量详解 一文中我们提到过,对引用变量使用 unset 只会取消引用,而不会销毁空间。因而从示例6中的结果也可以看出,global 声明的变量只是调用外部变量的一个别名而已。