牛骨文教育服务平台(让学习变的简单)

5.2.5 变量作用域

我们通过5.1章节的函数定义部份的学习我们知道了几个不同的规矩:

  1. 函数定义时后括号里面接的变量是形式上的参数(形参),与函数体外的变量没有任何关系。仅仅是在函数内部执行

  2. 函数内声明的变量也与函数外的变量没关系。

但是,我们实际的处理情况中会遇到这样的一个情况:

  1. 我想在函数体内定义的变量在函数体外用
  2. 我想把函数体外的变量拿到函数体内来使用

这个时候我们就需要用到超全局变量。我们来回顾一下之前的知识点:
| 全局变量名 | 功能说明 |
| -- | -- |
| $_COOKIE | 得到会话控制中cookie传值 |
| $_SESSION | 得到会话控制中session的值 |
| $_FILES | 得到文件上传的结果 |
| $_GET | 得到get传值的结果 |
| $_POST | 得到post传值的结果 |
| $_REQUEST | 即能得到get的传值结果,也能得到Post传值的结果 |

我们来通过实验来观察 一下外部变量(超全局变量)的特点,打破本章开头我们总结的规律:

我们定义一下global.html页现来写HTML内容:


<html>
    <head>
        <title>超全局数组实验</title>
    </head>
    <body>
        <!--先用POST来实验,以后你可以改成GET哟 -->
        <form action="glob.php" method="post">
            <input type="text" name="hongniu" /><br />

            <input type="submit" value="提交" />
        </form>

    </body>
</html>

我们将html的内容通过form表单提交给了glob.php页面,我们现在来写glob.php:

<?php

function demo(){

echo $_POST["hongniu"];

}

demo();
?>

通过这个小例子,你会发现超全局的$_POST等这一系列的超全局变量(外部变量)在函数内部也是可以用的。没有本文开始处变量作用域的限制。

其实我们所有声明的变量都放到了$GLOBALS这个数组下面,举个例子:

<?php

$hello = 10;

echo $GLOBALS["hello"]."<br />";

$GLOBALS["hello"] = "我爱你";

echo $hello;

?>

通过上例,你会发现$变量名是等价于$GLOBALS["变量名"] 。所有的变量都放到了$GLOBALS里面了。而$GLOBALS也是全局的。

因此,我们能够来达到我们的目的:将函数体内的变量(局部变量)在函数外部使用。也可以让函数外的变量到函数里面来使用。

1.通过$GLOBLAS来读取外部变量



<?php

$one = 10;

function demo(){
    $two = 100;

    $result = $two + $GLOBALS["one"];

    return $result;

}
//你会发现结果变成了110
echo demo();

?>

上例中:我们将函数体外的变量通过$GLOBALS拿到了函数体使用。所以,打破了函数外的变量不能在函数体内使用的限定。

2.通过$GLOBLAS,在函数内修改外部变量


<?php

$hongniu = "我是一个兵,来自老百姓";

function test(){

    echo "执行了函数test哟<br />";
    //调用test()函数,将通过$GLOBALS["hongniu"],把$hongniu的值改变掉

    $GLOBALS["hongniu"] = "帮助别人很快乐";
}

test();
//发现是不是输出的值变了呀?
echo $hongniu;

?>

通过上例:我们发现通过$GLOBALS["hongniu"],把$hongniu的值改变掉,所以在最后输出$hongniu的时候,值发生了变化。

3.通过$GLOBLAS,在函数内创建全局变量

<?php

function hello(){

    $GLOBALS["que"] = "提神喝茶更好哟";

    echo "你调了一下函数hello<br />";
}

hello();

echo $que;

?>

上例中,我们发现$que是不存在的,可以调用函数hello()后,在函数外部可以执行echo $que了,能够看到结果:提神喝茶更好。我们明白了,函数内声明的变量,通过$GLOBALS声明一个变量,也能够显示出来。

下面的知识是【了解】级别,我们越来越少的使用这种方式来声明全局变量了。在函数内使用global关键词后面跟一个或多个变量,就把变量变为了全局变量,格式如下:

global $变量1[,变量2,....变量n]

在global后面可以跟一个或者多个变量,变量用逗号分开。


$a = 10;

$b = 100;

function test(){

    global $a , $b;

    echo $a + $b;
}
//结果是不是显示出来了?
test();



上例中,你还可以试试在global关键词后面跟着未创建的变量,在函数体内定义变量值,修改变量的值试试。其实与$GLOBALS一样,只是用法不同而已。

注意:
不可在global 后写 $变量 = 值。


global
读音:[ˈgləʊbl]
解释:全局的,全球的