PHP变量作用域

花括号

很多语言都以花括号作为作用域界限,php中只有函数的花括号才构成新的作用域。

<?php
if (True)
{
	$a = 'var a';
}
var_dump($a);
for($i=0;$i<1;$i++)
{
	$b = 'var b';
	for($i=0;$i<1;$i++)
	{
		$c = 'var c';
	}
	var_dump($c);
}
var_dump($b);
var_dump($c);

运行结果是:

string(5) "var a" string(5) "var c" string(5) "var b" string(5) "var c"

可见if和for的花括号并无构成新的作用域。

而函数:

<?php
function test()
{
	$test = 'var test';
}
test();
var_dump($test);

结果是:

NULL

global关键字

php的执行是以一个.php脚本为单位,在一个.php脚本的执行过程中,可以include和require其他php脚本进来执行。
执行的.php脚本与include/require进来的脚本共享一个全局域(global scope)。

global关键字无论在哪层,所引用的都是全局域的变量。

 

<?php
$test = 'global test';
function a()
{
	$test = 'test in a()';
	function b()
	{
		global $test;
		var_dump($test);
	}
	b();
}
a();

 

 

执行结果是:

string(11) "global test"

闭包

闭包作用域跟函数类似,内层访问外层变量,外层不能访问内层变量

 

<?php
function a()
{
	$test = 'test in a()';
	function b()
	{
		var_dump($test);
		$varb = 'varb in b()';
	}
	b();
	var_dump($varb);
}
a();

 

 

执行结果:

NULL NULL

延伸阅读