变量作用域
无论怎样声明变量(按值或按引用),总之在php脚本的任何部位都是可以声明变量的。但是声明的位置会大大影响访问变量的范围。这个应该就叫做变量的作用域(scope)。
和其他一些编程语言类似,php有4种作用域:
- 局部变量
- 函数参数
- 全局变量
- 静态变量
局部变量
在函数中声明的变量被认为是局部变量,因为它只能在函数中引用。如果在函数外赋值,就会被认为是完全不同的另个变量。这里要注意的是,退出声明变量的函数的时候,该变量及相应的赋值就被撤销了。
我们知道这类变量很好用,比如下面一个例子。
$x=4; function assign(x){ $x=0; printf("$x inside function is %d <br />",$x); } assign(x); printf("$x outside of function is %d<br />",$x);
这段代码的执行结果是:
$x inside function is 0
$x outside of function is 4
这里输出了两个不同的$x的值,看到函数内外的$x是互相不受影响的。
函数参数
php与其他许多编程语言一样,任何接受参数的函数都必须在函数首部中声明这些参数。虽然这些参数接受函数外部的值,但是退出函数之后就无法访问这些函数了。
这里所称的参数只适用于按照值传递的参数,和其他语言一样,按引用传递的参数会受到函数内部修改的影响,我们将在未来介绍这些内容。
函数参数在函数名后面的括号内声明。比如下面这个例子。
// multiply a value by 10 and return it to the caller function x10 ($value) { $value = $value * 10; return $value; }
虽然在声明参数的函数内部可以访问和处理这些函数参数,但是在函数执行结束时,参数就会撤销。
全局变量
与局部变量相反,全局变量可以在程序的任何地方访问。但是,为了修改一个全局变量,必须在要修改该变量的函数中将其显示的声明为全局变量。这个很容易做到,只要在变量前面加上关键字GLOBAL,这样就可以将其识别为全局变量。如果将GLOBAL关键字放在一个已有的变量前面,则是告诉php要使用同名变量。下面是一个例子。
$samplevar = 15; function addone() { GLOBAL $samplevar; $somevar++; echo "var is $samplevar"; } addone();
$samplevar的值为16。但是,如果省略下面这个代码:
GLOBAL $samplevar;
变量$samplevar将赋值为1,因为$samplevar在addone()函数中被认为是一个局部变量。这个局部声明将隐含的设置为0,然后递增为1,最后显示的值就是1。
声明全局变量的另一个方法是使用php的$GLOBALS数组,下一节将正式介绍有关内容。考虑前面的例子,可以使用$GLOBALS数组将变量$samplevar声明为全局变量:
$samplevar = 15; function addone() { $GLOBAL["samplevar"]++; } addone(); echo "var is ".$GLOBALS["samplevar"];
返回如下值:
var is 16
由于全局变量的特性所以必须谨慎的选择将变量转换为全局变量。
静态变量
最后介绍的是我们的静态变量,它的作用域被称为静态(static)作用域。函数参数在函数退出时会撤销,静态变量在函数退出是不会丢失值,并且再次调用此函数是还能保留这个值,在变量名前面加上关键字STATIC就可以声明一个静态变量。
STATIC $sample;
例子如下:
function keep() { STATIC $count = 0; $count++; echo $count; echo "<br />"; } keep(); keep(); keep();
输出结果为:
1 2 3
这是因为$count是静态的,它会在每次执行函数时保留前面的值。
如果没有声明静态,输出的结果为:
1 1 1
静态作用域对于递归函数(recursive function)很有用。
下一次我们讲讲php的超级全局变量。。。