php初学者日记(7)

变量作用域

无论怎样声明变量(按值或按引用),总之在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的超级全局变量。。。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注