locality

局部变量

必须掌握

在任何一种编程语言中,变量都有一定的生效范围。大部分的 PHP 变量只有一个单独的范围,最常见的是 局部变量全局变量,首先我先来介绍一下局部变量:

一般来说,局部变量都存在于一个具体的函数体内。在这个函数体内的变量,都可以在函数体内被使用,但是一旦到了函数外部,这个变量就不存在了。同理,在函数外的一个变量,在函数内也是无法使用的,请看这个例子:


<?php
$wow = 'hey!'; // 声明一个全局变量

function sayHey()
{
	echo $wow;
}

sayHey(); // 抛出 Notice 异常:未定义 $wow 变量

function sayHello()
{
	$hello = 'Hey! Nice to meet you!';
}
echo $hello; // 同样报错:函数体内的变量不可以在外部访问
		

在上面两个例子中,函数内无法引用函数外的局部变量,函数外也无法使用函数内声明的变量。所以,当你想使用函数内的一个变量的值时,就需要使用 return 将它返回出函数体外。同理,函数之所以有参数,就是因为不能调用外部的变量,所以需要通过传递参数来将一个值传递到函数体内。

使用 include 或 require

在声明了变量之后,再引入文件,那么这个文件里的代码也可以使用这个变量。道理很简单,就像这样:


<?php
$wow = 'hey!';
include 'wow.php';

// 假设以下是 wow.php 中的代码
echo $wow; // 正常输出 hey
		

$wow 在整个作用域(也就是这个文件中)都会生效,所以他是一个全局变量。或者这么说, 在函数体外声明的变量,自改变量声明开始,到程序文件末尾,都属于有效的生效范围。 这种特性对引入的文件也是一样的。

global

全局变量

必须掌握

在函数体外声明的变量其实就可以看做是全局变量,但是由于函数的特性,他会默认在函数体内优先声明新的变量。所以想要使用函数体外的变量,就必须使用 global 关键字。请看代码:


$wow = 'Hey!';
$hello = 'Welcome to wowphp.com';

function sayHello()
{
	// 声明这两个变量是引用全局变量
	global $wow, $hello;
	echo $wow. ' ' . $hello;
}

sayHello(); // 输出 Hey! Welcome to wowphp.com
		

注意到标注的第 7 行里的 global 关键字了吗,它就可以让函数在体内使用外部定义的全局变量。除此之外,PHP 还提供了一个内置数组 $GLOBALS,你也可以用这个数组来在函数体内调用外部变量:


$wow = 'Hey!';
$hello = 'Welcome to wowphp.com';

function sayHello()
{
	echo $GLOBALS['wow'] . ' ' . $GLOBALS['hello'];
}

sayHello(); // 输出 Hey! Welcome to wowphp.com
		

$GLOBALS 是一个关联数组,这个概念会在以后数组的一章中讲到。在 $GLOBALS 中每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个 超全局变量。同样,有关超全局变量的介绍,也会在后面的章节中解释。

static

静态变量

了解即可

在 PHP 中还有一种特性叫“静态变量”,它仅仅存在于函数体中。但是在整个函数执行完后,这个值并不会消失,会一直保持更改之后的值。直到这个程序被销毁。请看一个没有使用静态变量的示例:


function echoStatic()
{
	$a = 0;
	echo $a;
	$a++;
}
echoStatic(); // 输出 0
echoStatic(); // 输出 0
echoStatic(); // 输出 0
		

你可以看到,我在函数体内让 $a 递增 1,并多次调用这个函数。但是得到的结果全部都是 0。因为每次调用时都会将 $a 的值设为 0 并输出 0。将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了。

那我就想让他调用一次就加一呢?很简单,将 $a 声明为静态变量即可:


function echoStatic()
{
	static $a = 0;
	echo $a;
	$a++;
}
echoStatic(); // 输出 0
echoStatic(); // 输出 1
echoStatic(); // 输出 2
		

现在,变量 $a 仅在第一次调用 echoStatic() 函数时被初始化,之后每次调用 echoStatic() 函数都会输出 $a 的值并加一。

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~