<?php
$str = 'hello baby!';
function say()
{
global $str;
$str = 'hello honey!';
}
say();
echo $str; //输出hello honey!
?>
$str 是一个全局变量,而这个全局变量在php程序中的函数中是不能访问的。
看上面的代码,按我的理解,global $str; say()函数在栈区中开辟空间时,say()函数中$str就像c语言的指针一样指向了函数外部的同名变量$str, 所以我们可以通过say函数内部的$str去改变全局变量的值。
php变量的生命周期中,定义在函数体外部的所谓 全局变量,函数内部是不能直接获得的。所以可以用global予以获取。看下面的代码:
<?php
$str = 'hello baby!';
function say()
{
global $str;
unset($str);
}
say();
echo $str; //输出 hello baby!
?>
这就证明了say()函数内部的$str就是个函数外部的全局变量$str的一个别名引用,其底层就是一个c语言的指针。
那$GLOBALS呢?这是一个超全局变量(Superglobal),如$GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV.。
而$GLOBALS,引用全局作用域中可用的全部变量。一个包含了全部变量的全局组合数组。变量的名字就是数组的键。即出现过的全局变量,就可以通过$GLOBALS这个数组取得。看代码:
<?php
$name = 'tagore';
$age = 80;
$saying = 'Wrong cannot afford defeat but rain can';
$saying1 = 'I can\'t choose the best, The best choose me!';
function show()
{
echo $GLOBALS['name'], ' said \'', $GLOBALS['saying1'], '\'<br />';
unset($GLOBALS['saying']);
}
echo '<pre>';
print_r($GLOBALS);
show(); //调用show函数
print_r($GLOBALS);
echo '</pre>';
?>
输出结果:
Array(
[GLOBALS] => Array
*RECURSION*
[_POST] => Array
(
)
[_GET] => Array
(
)
[_COOKIE] => Array
(
)
[_FILES] => Array
(
)
[name] => tagore
[age] => 80
[saying] => Wrong cannot afford defeat but rain can
[saying1] => I can't choose the best, The best choose me!
)
tagore said 'I can't choose the best, The best choose me!'
Array
(
[GLOBALS] => Array
*RECURSION*
[_POST] => Array
(
)
[_GET] => Array
(
)
[_COOKIE] => Array
(
)
[_FILES] => Array
(
)
[name] => tagore
[age] => 80
[saying1] => I can't choose the best, The best choose me!
)
$GLOBALS是由所有已定义全局变量自动形成的数组。变量名就是该数组的索引。即$GLOBALS[’saying‘]与函数外部的变量$saying是同一个变量,
所以将$GLOBALS['saying'] 删除后,该变量已不存在,所有无法输出了。
特与大家分享,如有问题,多多指教。