扣丁学堂带你了解并读懂PHP变量作用域
在现如今,随着互联网科技飞速的发展和进步, 目前在任何一种编程语言中,变量都有一定的生效范围,比如大部分的 PHP变量只有一个单独的范围,最常见的是局部变量和全局变量,首先我先来介绍一下局部变量。
一般来说,局部变量都存在于一个具体的函数体内。在这个函数体内的变量,都可以在函数体内被使用,但是一旦到了函数外部,这个变量就不存在了。同理,在函数外的一个变量,在函数内也是无法使用的,请看这个例子:
$wow = "hey!"; // 声明一个全局变量
function sayHey()
{
echo $wow;
}
sayHey(); // 抛出 Notice 异常:未定义 $wow 变量
function sayHello()
{
$hello = "Hey! Nice to meet you!";
}
echo $hello; // 同样报错:函数体内的变量不可以在外部访问PHP
在上面两个例子中,函数内无法引用函数外的局部变量,函数外也无法使用函数内声明的变量。所以,当你想使用函数内的一个变量的值时,就需要使用 return 将它返回出函数体外。同理,函数之所以有参数,就是因为不能调用外部的变量,所以需要通过传递参数来将一个值传递到函数体内。
使用 include 或 require
在声明了变量之后,再引入文件,那么这个文件里的代码也可以使用这个变量。道理很简单,就像这样:
$wow = "hey!";
include "wow.php";
// 假设以下是 wow.php 中的代码
echo $wow; // 正常输出 heyPHP
$wow 在整个作用域(也就是这个文件中)都会生效,所以他是一个全局变量。或者这么说, 在函数体外声明的变量,自改变量声明开始,到程序文件末尾,都属于有效的生效范围。 这种特性对引入的文件也是一样的。
GLOBAL
全局变量
必须掌握
在函数体外声明的变量其实就可以看做是全局变量,但是由于函数的特性,他会默认在函数体内优先声明新的变量。所以想要使用函数体外的变量,就必须使用 global 关键字。请看代码:
$wow = "Hey!";
$hello = "Welcome to wowphp.com";
function sayHello()
{
// 声明这两个变量是引用全局变量
global $wow, $hello;
echo $wow. " " . $hello;
}
sayHello(); // 输出 Hey! Welcome to wowphp.comPHP
注意到标注的第 7 行里的 global 关键字了吗,它就可以让函数在体内使用外部定义的全局变量。除此之外,PHP 还提供了一个内置数组 $GLOBALS,你也可以用这个数组来在函数体内调用外部变量:
$wow = "Hey!";
$hello = "Welcome to wowphp.com";
function sayHello()
{
echo $GLOBALS["wow"] . " " . $GLOBALS["hello"];
}
sayHello(); // 输出 Hey! Welcome to wowphp.comPHP
$GLOBALS 是一个关联数组,这个概念会在以后数组的一章中讲到。在 $GLOBALS 中每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个 超全局变量。同样,有关超全局变量的介绍,也会在后面的章节中解释。
STATIC
静态变量
了解即可
在 PHP 中还有一种特性叫“静态变量”,它仅仅存在于函数体中。但是在整个函数执行完后,这个值并不会消失,会一直保持更改之后的值。直到这个程序被销毁。请看一个没有使用静态变量的示例:
function echoStatic()
{
$a = 0;
echo $a;
$a++;
}
echoStatic(); // 输出 0
echoStatic(); // 输出 0
echoStatic(); // 输出 0PHP
你可以看到,我在函数体内让 $a 递增 1,并多次调用这个函数。但是得到的结果全部都是 0。因为每次调用时都会将 $a 的值设为 0 并输出 0。将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了。
那我就想让他调用一次就加一呢?很简单,将 $a 声明为静态变量即可:
function echoStatic()
{
static $a = 0;
echo $a;
$a++;
}
echoStatic(); // 输出 0
echoStatic(); // 输出 1
echoStatic(); // 输出 2PHP
现在,变量 $a 仅在第一次调用 echoStatic() 函数时被初始化,之后每次调用 echoStatic() 函数都会输出 $a 的值并加一。
注意:
声明静态变量时,必须是一个确定的值。如果是表达式就会报错,因为静态声明是在 PHP 被编译时解析的。