美文网首页
PHP学习之global变量

PHP学习之global变量

作者: 哈啰于先生 | 来源:发表于2017-02-20 17:00 被阅读0次

    php的变量分为三类:局部变量,全局变量,静态变量
    在一段php脚本中<?php >,变量可以在任意位置声明,作用域的意思是指变量在脚本中的使用范围。
    同样php的作用域分为三类:1、local(局部作用域) 2、global(全局作用域) 3、static(静态作用域)

    local和global作用域

    通常情况local和global作用域是容易混淆的,如何区分这两种作用域呢?规则如下:

    1、函数外部声明的变量拥有全局作用域,只能在函数外部访问。
    2、函数内部声明的变量拥有局部作用域,只能在函数内部访问。

    请看下面一段

    <?php 
    $var = '1'; //全局变量
    function foo(){
        $var = '2';//局部变量
    }
    foo();
    echo $var;
    ?>
    很明显打印的结果是:1
    

    虽然两个变量名都叫var,但是确实完全不同的两个变量,也是两种不同的作用域,打印出的很明显是全局的变量。

    global关键字

    我们经常会遇到一种情况,在函数外部声明了一个全局变量后,我们想在函数内部访问或者修改这一全局变量,这里我们就需要使用一个叫global的关键字来实现。

    还用刚刚那段代码,我们想在foo()函数内部修改$var的值,像上面那样写法肯定是不行,

    function foo(){ 
        $var = '2';//这里只是相当于重新定义一个局部变量,只不过名字恰好跟var是相同的
    }
    

    我们需要借助global关键字来实现,

    <?php 
    $var = '1';//全局变量
    function foo(){
        global $var;//在函数内创建一个局部变量,使用global关键字使其成为全局变量的同名引用
        $var = '2';
    }
    foo();
    echo $var;
    ?>
    打印的结果是:2
    

    $GLOBALS

    说到global关键字,就不得不提$GLOBALS,$GLOBALS是超全局变量,在生成全局变量的时候,PHP 同时在名为 $GLOBALS的数组中存储了所有的全局变量。

    <?php 
    $var = '1';//全局变量,即$GLOBALS['var'] = '1'
    function foo(){
        global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
        $var = '2';
    }
    foo();
    echo $var;
    ?>
    

    有兴趣的童鞋可以打印下var_dump($GLOBALS);看看结果。
    结合unset()方法会更容易理解,看如下两段代码

    第一段
    <?php 
    $var = '1';//全局变量,即$GLOBALS['var'] = '1'
    function foo(){
        global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
        $var = '2';
        unset($var);
    }
    foo();
    echo $var;
    ?>
    打印结果是:2
    
    第而段
    <?php 
    $var = '1';//全局变量,即$GLOBALS['var'] = '1'
    function foo(){
        global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
        unset($var);
        $var = '2';
    }
    foo();
    echo $var;
    ?>
    打印结果是:1
    

    因为我们知道global是生成一个全局变量的别名引用(类似于桌面上一个文件跟它的快捷方式)。引用的值修改后,全局变量的值也就修改了,在第一段代码中,修改了快捷方式的内容,原文件的内容也得到了修改,然后又删除了快捷方式(unset($var);),所以结果是修改后的值。
    但是在第二段代码中,在$var = '2';之前使用了unset($var);方法销毁了引用变量,所以导致全局的变量值并未修改。

    再看一段代码

    <?php 
    $var = '1';//全局变量,即$GLOBALS['var'] = '1'
    function foo(){
        global $var; //全局变量的引用,即 $var = &$GLOBALS['var']
        unset($GLOBALS['var']);
        $var = '2';
        //或者在此调用unset($GLOBALS['var']);
    }
    foo();
    echo $var;
    ?>
    打印结果都是空
    

    因为全局变量销毁了,引用也销毁了(原文件没了,快捷方式也没了)

    相关文章

      网友评论

          本文标题:PHP学习之global变量

          本文链接:https://www.haomeiwen.com/subject/jdlewttx.html