关于$GLOBALS 和 global 关键字的区别

区别就是:

用 $GLOBALS 调的是 全局变量本身!是全局变量本身!是它自己本身!

而用global 关键字声明 则是对 全局变量本身 的一个引用(也就是起一个别名)

talk is cheap, show you the code!

例 1:关键字  global

<?php

$lisi = 'lisi';
$zhangsan = 'zhangsan';

// 使用global 关键字
function _global() {
     global $lisi, $zhangsan;
    /*
    这里 global 的作用就是(以 $lisi 为例):
    把全局的 $lisi 引用到 局部作用域(alias 函数)里面
    此时局部变量中的 $lisi 和 全局的 $lisi 是 【不同】 的两个变量。
    只不过 局部的 $lisi 是 全局 $lisi 的一个别名。看下面的表达式。
    局部 = 引用全局
    $lisi = &lisi; 
    */
    echo $lisi, "
"; // lisi 因为是全局$lisi的别名,所以它的值 也是 lisi
    
    /*
    在局部操作的 $lisi, 【始终】是局部的$lisi。 
    因为引用全局的 $lisi,所以在改变局部的$lisi 的值以后(普通的赋值),
    全局的$lisi 的值也会改变
    */
    $lisi = 'wangwu'; // 此时,局部和全局的 $lisi 的值 都改变为 'wangwu'
    echo $lisi, "
"; // wangwu

    // 现在 局部的$lisi 不再引用 全局的 $lisi, 改为引用 $zhangsan
    $lisi = &$zhangsan; // 此时,局部 $lisi 断开了和全局$lisi 引用,两者已经没有任何关系了

    echo $lisi, "
"; // zhangsan     现在局部 $lisi 的值是  'zhangsan', 而全局 $lisi 依然是 'wangwu'

    // 现在把 局部 $lisi 删除,并不会影响任何一个全局变量
    unset($lisi);//  这时,全局的 $lisi 是'wangwu' ,$zhangsan 是 'zhangsan'
}


_global(); // lisi -> wangwu -> zhangsan
echo $lisi, "
"; // wangwu
echo $zhangsan, "
"; // zhangsan

例 2:超全局变量 $GLOBALS

<?php
$lisi = 'lisi';
$zhangsan = 'zhangsan';

function _GLOBALS() {
    /*
    通过 超全局变量 $GLOBALS 操作的变量,即是 全局变量本身, 没有局部变量的概念了
    */
    $GLOBALS['lisi'] = 'wangwu'; // 操作的就是 全局变量 $lisi 本身
    $GLOBALS['lisi'] = &$GLOBALS['zhangsan']; // 全局变量 $lisi 引用了 全局变量 $zhangsan

    $GLOBALS['lisi'] = 'zhaoliu'; // 此时 全局变量 $lisi 和 $zhangsan 的值 都改变为 'zhaoliu'

    unset($GLOBALS['lisi']); // 将全局变量 $lisi 销毁 
}

_GLOBALS();
echo $zhangsan; // zhaoliu
echo $lisi; // undefined variable 

本人如果理解有偏差,还望各位指出

  

Talk is cheap, show me the code.
原文地址:https://www.cnblogs.com/cidgur/p/8889388.html