-
花括号
很多语言都以花括号作为作用域界限,PHP中只有函数的花括号才构成新的作用域。
01<?php02if(True) {03$a='var a';04}0506var_dump($a);0708for($i= 0;$i< 1;$i++) {09$b='var b';10for($i= 0;$i< 1;$i++) {11$c='var c';12}13var_dump($c);14}1516var_dump($b);17var_dump($c);18?>运行结果是:
1string(5)"var a"string(5)"var c"string(5)"var b"string(5)"var c"可见if和for的花括号并无构成新的作用域。
而函数:
1<?php2functiontest() {3$test='var test';4}56test();7var_dump($test);8?>结果是:
1NULLglobal关键字
PHP的执行是以一个.php脚本为单位,在一个.php脚本的执行过程中,可以include和require其他PHP脚本进来执行。
执行的.php脚本与include/require进来的脚本共享一个全局域(global scope)。
global关键字无论在哪层,所引用的都是全局域的变量。
01<?php02$test='global test';03functiona() {04$test='test in a()';05functionb() {06global$test;07var_dump($test);08}09b();10}1112a();13?>执行结果是:
1string(11)"global test"闭包
闭包作用域跟函数类似,内层不能访问外层变量,外层不能访问内层变量。
01<?php02functiona() {03$test='test in a()';04functionb() {05var_dump($test);// $test不能被访问06$varb='varb in b()';07}0809b();10var_dump($varb);// $varb也不能被访问11}1213a();14?>执行结果:
1NULL NULL延伸阅读:
- variable scope: http://www.php.net/manual/en/language.variables.scope.php
- php rfc closures:http://wiki.php.net/rfc/closures