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"

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

而函数:

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

 

 

延伸阅读:

 

posted @   52php  阅读(3865)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示