转:PHP变量作用域(花括号、global、闭包)

  • 花括号

    很多语言都以花括号作为作用域界限,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"

    可见iffor的花括号并无构成新的作用域。

    而函数:

    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

    延伸阅读:

原文地址:https://www.cnblogs.com/youxin/p/3529955.html