0

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

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

5 回答 5

1

该值是NULL因为没有带有 name 的全局变量$a

以下将打印“全局”:

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

function a() {
    $a = "a";
    $aa = function() {
        global $a;
        var_dump($a);
    };
    $aa();
}
a();
于 2013-09-07T16:44:25.327 回答
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();

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

于 2013-09-08T01:58:01.743 回答
0

你可以这样写:

function a() {
    $a = "a";
    function b() {
        global $a;
        var_dump($a);
    };
    $aa = "b";
    $aa();
}
a();
于 2013-09-07T16:40:35.647 回答
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

于 2013-09-07T16:56:05.093 回答
0

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

function a() {

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

    $ref = &$$a;

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

输出:string(8) "variable"

于 2013-09-07T16:54:10.337 回答