关于closures:PHP函数使用/ global返回匿名函数

PHP function returning anonymous function with use / global

我对PHP不熟悉,目前正在学习闭包的概念。

对于使用use()的闭包,我知道可以执行以下操作:

1
2
3
4
5
6
7
$y ="hello";
$c = function() use ($y) {
    return $y;
};

print_r($c()); // prints out 'hello'
echo '<br />';

但是,我在执行返回另一个匿名函数的函数时遇到问题,例如:

1
2
3
4
5
6
7
8
$u = function() {
    return function () use ($y) {
        return $y;
    };
};

print_r($u()); // empty closure object...
echo '<br />';

我知道当我把上面的代码修改为下面的代码时,代码就可以完美地工作。但我不明白为什么。希望有人能给我解释一下。谢谢。

1
2
3
4
5
6
7
8
$b = function() use ($y) {
    return function () use ($y) {
        return $y;
    };
};

print_r($b()); // output :  [y] => hello
echo'<br />';

以类似的方式,我对下面使用global的代码有一个问题,为什么它不起作用:

1
2
3
4
5
6
7
8
9
$k = function() {
    return function() {
        global $y;
        return $y;
    };
};

print_r($k()); // prints out 'Closure Object ( )'
echo '<br />';

请不要告诉我如何交换代码使之工作。正如我所尝试的,我知道如何改变和使这些代码工作。相反,我想知道当我在返回另一个匿名函数时,为什么global和use()不起作用。

感谢您帮助我澄清有关如何使用/全局工作的想法。


I know that when I modify the above codes to the below one, then the code works perfectly. BUT I do NOT understand the reason why. Hope someone can explain it to me.

它不能像您期望的那样工作的原因是因为您的关闭正在返回另一个关闭。

不能调用de-reference闭包,但请考虑将其作为如何工作的示例:

1
2
3
4
5
6
7
8
9
10
11
$k = function() {
    return function() {
        global $y;
        return $y;
    };
};

$first = $k();
print_r($first); // it's a closure, because your main closure returns another closure
$second = $first();
print_r($second); // here is"hello" as you expect

以下内容不起作用:

1
print_r($k()());

在不存在use $y的情况下,返回使用未定义变量的闭包的过程实际上会在原始闭包上创建一个静态属性,其值为空,这就是您看到此输出的原因:

1
2
3
4
5
6
7
8
9
var_dump($u());

object(Closure)#2 (1) {
 ["static"]=>
  array(1) {
    ["y"]=>
    NULL
  }
}

注意,如果您在上面做了错误报告,那么您也会得到一个未定义的变量错误。

您似乎已经意识到了,但我还是要提到,在闭包内无法访问$y,因为它超出了函数的范围。这就是为什么当您使用global注册它时,它会返回您期望的结果,并且当您从外部闭包注册use时。