1.4 变量作用域实践

我们知道,在PHP中定义一个变量后,在脚本任意位置都可以存取访问,这被称为“全局变量”,而定义在函数或类的方法中的变量只可以在函数内部访问,这叫作“局部变量”。

使用局部变量可以使源代码易于管理,试想如果所有的变量都是全局的,任何位置都可访问、修改它的内容,如果变量重名就可能发生“污染”。通过声明局部变量来限制一个变量的存取范围,可以让代码模块化,易调试,让应用运行更健壮。

下面我们就来看看如何使用全局变量和局部变量,如代码清单1-1所示:

代码清单1-1使用全局变量与局部变量

        <? php
        $globalName = "老杜";
        function getvar() {
            $localName = "Raymond";
            echo"Hello, $localName! <br>";
        }
        getvar();
        echo "The value of \$globalName is: '$globalName'<br />";
        echo "The value of \$localName is: '$localName'<br />";
        ?>

该脚本运行后将显示如下内容:

        Hello, 老杜!
        The value of $globalName is: 'Raymond'
        The value of $localName is: ''

在上面的代码中,我们一共创建了两个变量:其中$globalName是全局变量,它没有在任何函数体里;另一个是名为$localName的局部变量,是在sayHello()函数里内部定义的。

程序运行时先是调用sayHello()函数,显示的是“hello, Raymond! ”,接下来用echo显示两个变量,分别是$globalName和$localName。由于$globalName是定义在函数之外的全局变量,在脚本任何位置都可以访问,因此显示为“Raymond”。而$localName定义在sayHello()函数内部,只能在函数内访问。脚本中使用echo来访问这个局部变量,而PHP不允许外部访问此局部变量。因此运行时,PHP认为程序要创建一个新的全局变量$localName,并将默认值初始化为空,所以显示的时候是空白的。

PHP允许函数内部可访问外部全局变量,只需在函数中使用global关键字即可。我们来看代码清单1-2:

代码清单1-2使用全局变量与局部变量

        <? php
        $globalName = "老杜";
        function sayHello() {
            $localName = "Harry";
            echo "Hello, $localName! <br />";
            global $globalName;
            echo "Hello, $globalName! <br />";
        }
        sayHello();
        ?>

该段脚本会输出下面的内容:

        Hello, Harry!
        Hello, 老杜!

由于在sayHello()函数里使用了global来声明$globalname为全局性质,因此它的内容被打印了出来。