变量的作用域是变量的一个作用范围,在这个范围内变量为可见的,即可以访问该变量的代码区域, 相反,如果不在这个范围内,变量是不可见的,无法被调用。 (全局变量可以将作用范围看作为整个程序)
花括号
很多语言都以花括号作为作用域界限,PHP中只有函数的花括号才构成新的作用域。
01
|
<?php
|
02
|
if (True) {
|
03
|
$a = 'var a' ;
|
04
|
}
|
05
|
06
|
var_dump( $a );
|
07
|
08
|
for ( $i = 0; $i < 1; $i ++) {
|
09
|
$b = 'var b' ;
|
10
|
for ( $i = 0; $i < 1; $i ++) {
|
11
|
$c = 'var c' ;
|
12
|
}
|
13
|
var_dump( $c );
|
14
|
}
|
15
|
16
|
var_dump( $b );
|
17
|
var_dump( $c );
|
18
|
?>
|
运行结果是:
1
|
string(5) "var a" string(5) "var c" string(5) "var b" string(5) "var c"
|
可见if和for的花括号并无构成新的作用域。
而函数:
1
|
<?php
|
2
|
function test() {
|
3
|
$test = 'var test' ;
|
4
|
}
|
5
|
6
|
test();
|
7
|
var_dump( $test );
|
8
|
?>
|
结果是:
1
|
NULL
|
global关键字
PHP的执行是以一个.php脚本为单位,在一个.php脚本的执行过程中,可以include和require其他PHP脚本进来执行。
执行的.php脚本与include/require进来的脚本共享一个全局域(global scope)。
global关键字无论在哪层,所引用的都是全局域的变量。
01
|
<?php
|
02
|
$test = 'global test' ;
|
03
|
function a() {
|
04
|
$test = 'test in a()' ;
|
05
|
function b() {
|
06
|
global $test ;
|
07
|
var_dump( $test );
|
08
|
}
|
09
|
b();
|
10
|
}
|
11
|
12
|
a();
|
13
|
?>
|
执行结果是:
1
|
string(11) "global test"
|
闭包
闭包作用域跟函数类似,内层不能访问外层变量,外层也不能访问内层变量。
01
|
<?php
|
02
|
function a() {
|
03
|
$test = 'test in a()' ;
|
04
|
function b() {
|
05
|
var_dump( $test ); // $test不能被访问
|
06
|
$varb = 'varb in b()' ;
|
07
|
}
|
08
|
09
|
b();
|
10
|
var_dump( $varb ); // $varb也不能被访问
|
11
|
}
|
12
|
13
|
a();
|
14
|
?>
|
执行结果:
1
|
NULL NULL
|