• PHP中全局变量的使用global和$GLOBALS[]


    From: http://blog.csdn.net/happyqyt/article/details/7219889

    用PHP开发项目,不可避免的会使用到全局变量,比如一些网站的配置信息,全站通用,那就可以在一个地方设置,然后多个地方调用。

    把变量定义为全局变量可以有两种方法:global和$GLOBALS[]。很多人都认为global和$GLOBALS[]只是写法不同而已,其实是有差别的。

    先来看看global
    php对global变量的解析是:global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。

    看一下下面一段PHP代码:

    1. $a=123;  
    2. function test1(){  
    3.     global $a;  //如果不把$a定义为global变量,函数体内是不能访问$a的   
    4.     echo $a;  //123   
    5. }  
    6. test1();  
    7.   
    8. global $b;  
    9. $b = 456;  
    10. function test2(){  
    11.     var_dump($b);  //NULL   
    12. }  
    13. test2();  
    14.   
    15. function test3(){  
    16.     global $c;  
    17.     $c=789;  
    18. }  
    19. test3();  
    20. echo $c;  //789  
    $a=123;
    function test1(){
        global $a;  //如果不把$a定义为global变量,函数体内是不能访问$a的
        echo $a;  //123
    }
    test1();
    
    global $b;
    $b = 456;
    function test2(){
        var_dump($b);  //NULL
    }
    test2();
    
    function test3(){
        global $c;
        $c=789;
    }
    test3();
    echo $c;  //789
    1. $a=123;  
    2. function test1()  
    3. {  
    4. global $a;   //如果不把$a定义为global变量,函数体内是不能访问$a的   
    5. echo $a; //123   
    6. }  
    7. test1();  
    8.   
    9. global $b;  
    10. $b=456;  
    11. function test2()  
    12. {  
    13. var_dump($b);    //NULL   
    14. }  
    15. test2();  
    16.   
    17. function test3()  
    18. {  
    19. global $c;  
    20. $c=789;  
    21. }  
    22. test3();  
    23. echo $c;   //789  
    $a=123;
    function test1()
    {
    global $a;   //如果不把$a定义为global变量,函数体内是不能访问$a的
    echo $a; //123
    }
    test1();
    
    global $b;
    $b=456;
    function test2()
    {
    var_dump($b);    //NULL
    }
    test2();
    
    function test3()
    {
    global $c;
    $c=789;
    }
    test3();
    echo $c;   //789
    通过代码得出总结:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用。

    再来看看$GLOBALS[]

    1. $var1=1;  
    2. $var2=2;  
    3. function test1(){  
    4.     $GLOBALS['var2']=&$GLOBALS['var1'];  
    5. }  
    6. test1();  
    7. echo $var2;  //1   
    8.   
    9. $var3=1;  
    10. $var4=2;  
    11. function test2(){  
    12.     global $var3,$var4;  
    13.     $var4=&$var3;  
    14. }  
    15. test2();  
    16. echo $var4;  //2  
    $var1=1;
    $var2=2;
    function test1(){
        $GLOBALS['var2']=&$GLOBALS['var1'];
    }
    test1();
    echo $var2;  //1
    
    $var3=1;
    $var4=2;
    function test2(){
        global $var3,$var4;
        $var4=&$var3;
    }
    test2();
    echo $var4;  //2
    1. $var1 = 1;    
    2. $var2 = 2;    
    3. function test1(){    
    4.      $GLOBALS['var2'] = &$GLOBALS['var1'];    
    5. }    
    6. test1();    
    7. echo $var2;  //1   
    8.   
    9. $var3 = 1;    
    10. $var4 = 2;    
    11. function test2(){    
    12.      global $var3,$var4;    
    13.      $var4 = &$var3;    
    14. }    
    15. test2();    
    16. echo $var4;   //2  
    $var1 = 1;  
    $var2 = 2;  
    function test1(){  
         $GLOBALS['var2'] = &$GLOBALS['var1'];  
    }  
    test1();  
    echo $var2;  //1
    
    $var3 = 1;  
    $var4 = 2;  
    function test2(){  
         global $var3,$var4;  
         $var4 = &$var3;  
    }  
    test2();  
    echo $var4;   //2
    为什么$var2的打印结果是1,而$var4的打印结果为2呢?其实就是因为$var4的引用指向了$var3的引用地址。$var4的实际值并没有改变。官方的解释是:$GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针。

    也许这个例子还不是很清晰,我再引入一个例子:

    1. $var1 = 1;      
    2. function test1(){      
    3.      unset($GLOBALS['var1']);      
    4. }      
    5. test1();      
    6. var_dump($var1);   //NULL     
    7.   
    8. $var2 = 1;      
    9. function test2(){      
    10.     global  $var2;      
    11.      unset($var2);      
    12. }      
    13. test2();      
    14. echo $var2;   //1   
    $var1 = 1;    
    function test1(){    
         unset($GLOBALS['var1']);    
    }    
    test1();    
    var_dump($var1);   //NULL  
    
    $var2 = 1;    
    function test2(){    
        global  $var2;    
         unset($var2);    
    }    
    test2();    
    echo $var2;   //1 
    1. $var1 = 1;    
    2. function test1(){    
    3.      unset($GLOBALS['var1']);    
    4. }    
    5. test1();    
    6. var_dump($var1);   //NULL   
    7.   
    8. $var2 = 1;    
    9. function test2(){    
    10.     global  $var2;    
    11.      unset($var2);    
    12. }    
    13. test2();    
    14. echo $var2;   //1  
    $var1 = 1;  
    function test1(){  
         unset($GLOBALS['var1']);  
    }  
    test1();  
    var_dump($var1);   //NULL
    
    $var2 = 1;  
    function test2(){  
        global  $var2;  
         unset($var2);  
    }  
    test2();  
    echo $var2;   //1

    $var1的值被删除,而$var2的值还存在。这就证明,$var2只是别名引用,本身的值没有受到任何的改变。

    也就是说global $var其实就是$var = &$GLOBALS['var'],调用外部变量的一个别名而已!

  • 相关阅读:
    华为全联接大会2019,共创智能新高度
    CTDC2019首席技术官领袖峰会,AI赋能 智享5G
    2019全球体验设计峰会:体验赋能商业,创造更好体验
    全球闪存峰会旨在深化技术创新,增进闪存产业链上下游
    PyCon 2019火热来袭,与大数据、人工智能等专家一起探讨Python语言
    PHPConChina 2019 PHP开发者大会将于8月在上海举办!
    2019腾讯Live开发者大会(TLC),引领技术新趋势
    2019 HTML5深度应用开发实践
    2019年5G物联网关键技术与应用培训,了解5G网络发展现状及进展
    2019第二届企业云服务大会 -- 企业智变,云化未来
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/4995628.html
Copyright © 2020-2023  润新知