PHP: 关键字global 和 超全局变量$GLOBALS的用法、解释、区别

$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。

php语法中,很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然
根据官方的解释是
1. $GLOBALS[‘var’]是外部的全局变量本身
2. global $var是外部$var的同名引用或者指针。

举例说明一下:

<?php
    $var1 = 1;
    $var2 = 2;

    function test(){
        $GLOBALS['var2′] = &$GLOBALS['var1′];
    }
    test();
    echo $var2;
?>

正常打印结果为1

<?php
    $var1 = 1;
    $var2 = 2;

    function test(){
        global $var1,$var2;
        $var2 = &$var1;
    }
    
    test();
    echo $var2;
?>

意外打印结果为2

为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。
我们再来看一个例子吧。

<?php
    $var1 = 1;
    function test(){
        unset($GLOBALS['var1']);
    }
    
    test();
    echo $var1;
?>

因为$var1被删除了,所以什么东西都没有打印

<?php
    $var1 = 1;

    function test(){
        global $var1;
        unset($var1);
    }
    
    test();
    echo $var1;
?>

意外的打印了1。证明删除的只是别名|引用,起本身的值没有受到任何的改变
明白了吧?
也就是说global $var其实就是$var = &$GLOBALS[‘var’]。调用外部变量的一个别名而已

 

$GLOBALS引用全局作用域中可用的全部变量

一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

<?php
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 in global scope: Example content
$foo in current scope: local variable

注释

Note:

“Superglobal”也称为自动化的全局变量。这就表示其在脚本的所有作用域中都是可用的。不需要在函数或方法中用 global $variable; 来访问它。

Note: 变量可用性

与所有其他超全局变量不同,$GLOBALS在PHP中总是可用的。

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

这些超全局变量是:

很实用的一个例子: extract array into global variables

function foo() {
  $vars = array('aa' => 11, 'bb' => 22);
  $GLOBALS += $vars;
}

foo();
echo $aa;
function extract_array($array=false)
{
    //if($array AND is_array($array)) extract($array);
    //else { extract($_POST); extract($_GET); }

    if($array AND is_array($array)) $GLOBALS += $array;
    else{ $GLOBALS += $_POST; $GLOBALS += $_GET; }
}

 

更多参考:

变量范围

PHP: extract 将数组array的key变为变量 ( extract函数的定义和用法 )

HP7革新与性能优化

JQuery: 使用Ajax赋值给全局变量失败异常的解决方法,ajaxSetup, jquery ajax global

 

本文: PHP: 关键字global 和 超全局变量$GLOBALS的用法、解释、区别

One Comment

Leave a Reply