php中global和$GLOBALS 的区别

<?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'] 删除后,该变量已不存在,所有无法输出了。

特与大家分享,如有问题,多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值