PHP变量作用域(花括号、global、闭包)
花括号
很多语言都以花括号作为作用域界限,PHP中只有函数的花括号才构成新的作用域。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?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 ); ?> |
运行结果是:
1 | string(5) "var a" string(5) "var c" string(5) "var b" string(5) "var c" |
可见if和for的花括号并无构成新的作用域。
而函数:
1 2 3 4 5 6 7 8 | <?php function test() { $test = 'var test' ; } test(); var_dump( $test ); ?> |
结果是:
1 | NULL |
global关键字
PHP的执行是以一个.php脚本为单位,在一个.php脚本的执行过程中,可以include和require其他PHP脚本进来执行。
执行的.php脚本与include/require进来的脚本共享一个全局域(global scope)。
global关键字无论在哪层,所引用的都是全局域的变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $test = 'global test' ; function a() { $test = 'test in a()' ; function b() { global $test ; var_dump( $test ); } b(); } a(); ?> |
执行结果是:
1 | string(11) "global test" |
闭包
闭包作用域跟函数类似,内层访问外层变量,外层不能访问内层变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php function a() { $test = 'test in a()' ; function b() { var_dump( $test ); // $test不能被访问 $varb = 'varb in b()' ; } b(); var_dump( $varb ); // $varb也不能被访问 } a(); ?> |
执行结果:
1 | NULL NULL |
延伸阅读:
- variable scope: http://www.php.net/manual/en/language.variables.scope.php
- php rfc closures:http://wiki.php.net/rfc/closures
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步