-
花括号
很多语言都以花括号作为作用域界限,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
延伸阅读:
- variable scope: http://www.php.net/manual/en/language.variables.scope.php
- php rfc closures:http://wiki.php.net/rfc/closures