在PHP中使用闭包中的global

时间:2013-09-07 16:28:56

标签: php variables closures global

不知何故,以下结果为NULL。为什么会这样?我发现知道很重要,因为use语句不支持变量变量。

function a() {
    $a = "a";
    $aa = function() {
        global $a;
        var_dump($a);
    };
    $aa();
}
a();

5 个答案:

答案 0 :(得分:1)

值为NULL,因为没有名称为$a的全局。

以下将打印“global”:

$a = "global"; // global variable initialization

function a() {
    $a = "a";
    $aa = function() {
        global $a;
        var_dump($a);
    };
    $aa();
}
a();

答案 1 :(得分:0)

你可以这样写:

function a() {
    $a = "a";
    function b() {
        global $a;
        var_dump($a);
    };
    $aa = "b";
    $aa();
}
a();

答案 2 :(得分:0)

也许你可以引用变量变量。

function a() {

    $a = "b";
    $b = "variable";

    $ref = &$$a;

    $aa = function() use ($ref) {
        var_dump($ref);
    };
    $aa();
}
a();

输出:string(8) "variable"

答案 3 :(得分:0)

变量$t是您可以使用$$a访问的变量变量。请注意,在函数a()中,永远不会使用$t,因此应该是您想要的。

$t = 3;
$a = 't';
function a()
{
    global $a, $$a;
    $x = $$a;
    $b = function()  use ($x) {
        echo $x;
    };
    $b();
}
a();

代码打印3

答案 4 :(得分:0)

global $a访问名为$a全局变量。它不是函数a中的局部变量。由于您从未初始化名为$a的全局变量,因此它为NULL。

为了使局部变量在匿名函数中可用,必须使用use子句捕获它们。局部变量可以通过值或参考来捕获。

如果要按值捕获(这意味着局部变量$a的值在定义时被复制到闭包中):

function a() {
    $a = "a";
    $aa = function() use ($a) {
        var_dump($a);
    };
    $aa();
}
a();

如果你想通过引用捕获(这意味着在闭包内它直接引用变量$a):

function a() {
    $a = "a";
    $aa = function() use (&$a) {
        var_dump($a);
    };
    $aa();
}
a();

在这种情况下,两者都是相同的。但是如果你在创建闭包之后修改了变量,并且在它运行之前,它会产生不同的结果(按值捕获仍然具有前一个值)。