php中global和$GLOBALS区别分析

作者:袖梨 2022-06-24

根据官方的解释是

1.$GLOBALS['var']是外部的全局变量本身。

2.global $var是外部$var的同名引用或者指针。

先看下面的例子:

举例说明一下:

 

 代码如下 复制代码
        $var1 = 1; 
    $var2 = 2; 
    function test(){ 
         $GLOBALS['var2'] = &$GLOBALS['var1']; 
    } 
    test(); 
    echo $var2; 
    ?> 

正常打印结果为1

 代码如下 复制代码


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

 

意外打印结果为2

为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变


我们都知道PHP中的函数所产生的变量都是函数的私有变量,那么global产生的变量也确定逃不出这个规矩,为什么这么说呢,看下面的代码:

PHP代码

 

 代码如下 复制代码

function test() {
global $a;
unset($a);
}

$a = 1;
test();
print $a;
?>

履行效果为:
1

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?PHP的bug?
都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面参加
print $a;
也就是说global产生 了test函数外部$a的别名 变量“$a”,为了和外面的$a差别
接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址
所以我们得出一个结论,在函数中global和$GLOBALS[]的差别在于:
global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但转变了别名变量的指向地址,就会产生一些意料不到情况,例如例子1.
$GLOBALS[]确确凿实调用是外部的变量,函数内外会始终维持一致!

可以对照 下面两个列子:

 代码如下 复制代码
global:
function myfunction(){
global $bar;
unset($bar);
}
$bar="someting";
myfunction();
echo $bar;
?>
输出:someting
$global[]:
function foo()
{
unset($GLOBALS['bar']);
}
$bar = "something";
foo();
echo $bar;
?>
输出:空

PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中主动生效,除非被局部变量笼罩。这可能引起一些问题,有些人可能漫不经心的转变一个全局变量。PHP 中全局变量在函数中应用时必须 申明 为全局。
应用 global的例子

 代码如下 复制代码

$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>

以上脚本的输出将是 "3"。在函数中申明 了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。

我们再来看一个例子吧。

 代码如下 复制代码

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

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

 代码如下 复制代码

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

意外的打印了1。证明删除的只是别名|引用,起本身的值没有受到任何的改变。

global问题解析:
question:我在 config.inc.php中定义了一些变量($a),在别的文件中函数外部 include("config.inc.php"),函数内部需要使用这些变量$a,如果没有声明的话,echo $a是打印不出来任何东西的。因此声明global $a,但是有很多函数和很多变量,总不能不断重复的这样声明吧?有什么好的解决办法,请指点。
answer1:先在config.inc.php里定义常量:define(常量名,常量值)
再在其他需要用到的地方require 'config.inc.php',
然后就能在这个文件里直接使用这个常量了。
answer2:我也有个办法,就是定义数组,如$x[a],$x,那样就只要声明global $x一个了。
answer3:我试了你的这个方法,不行啊。
answer4:改你的php.ini文件。

相关文章

精彩推荐