变量

变量范围

变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的PHP变量只有一个单独的范围。这个单独的范围跨度同样包含了include和require引入的文件。例如:

1
2
3
4
<?php
$a = 1;
include 'b.php';
?>

这里变量$a将会在包含文件b.php中生效。但是,在用户自定义函数中,一个局部函数范围将被引入,任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。例如

1
2
3
4
5
6
7
8
9
<?php
$a =1;//全局
function Test()
{
echo $a; //位于函数内部
}
Test();
?>

这个脚本将不会有任何输出,因为echo语句引用了一个局部版本的变量$a,它并没有被赋值。PHP的全局变量和C语言的有一点点不同,在C语言中,全局变量在函数中自动生效,除非被局部变量覆盖。而PHP中全局变量在函数中使用时必须声明为global。

global关键字

例:

1
2
3
4
5
6
7
8
9
10
11
<?php
$a = 1;
$b = 2;
function sum()
{
global $a,$b;
$b = $a + $b;
}
sum();
echo $b;
?>

以上脚本的输出将是3。

在函数中声明了全局变量 $a 和 $b 之后,对任一变量的所有引用都会指向其全局版本。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。

在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。

使用静态变量

变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不会丢失。例如:

1
2
3
4
5
6
7
8
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>

该函数没什么用处,因为每次调用时都会将$a的值设为0并输出0。将变量加一的$a++没有作用,因为一旦退出本函数则变量$a就不存在了。要写一个不会丢失本次计数值的技术函数,要将变量$a定义为静态的。如下例子:

1
2
3
4
5
6
7
8
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>

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

静态变量也提供了一种处理递归函数的方法。写递归函数的时候,可能会无穷递归下去。必须确保有充分的方法来终止递归。以下的简单的例子说明使用静态变量来判断何时停止。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if($count < 10)
{
test();
}
$count--;
}
?>

可变变量

将变量名再赋予某个变量

可变函数

将函数名赋予某个变量,当调用该变量外加括号时,即调用该函数。