PHP函数返回使用/全局变量的匿名函数

3

我是一名新手PHP程序员,目前正在学习闭包的概念。

关于使用 use() 的闭包,我知道可以这样做:

$y = "hello"; 
$c = function() use ($y) {
    return $y; 
}; 

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

然而,我在编写一个返回另一个匿名函数的函数时遇到了问题,例如:

$u = function() {
    return function () use ($y) {
        return $y; 
    }; 
}; 

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

我知道当我将上面的代码修改为下面的代码时,代码就可以完美地运行。但我不明白原因。

$b = function() use ($y) {
    return function () use ($y) {
        return $y; 
    };
}; 

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

以类似的方式,我对下面使用全局变量的代码有一个问题,为什么它不起作用:
$k = function() {
    return function() {
        global $y; 
        return $y; 
    }; 
}; 

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

请不要告诉我如何交换代码使其能够工作。因为我已经尝试过,并且知道如何更改和使这些代码工作。相反,我想知道为什么当我在另一个匿名函数的返回中调用global和use()时它们不起作用。
1个回答

1
我知道当我将上述代码修改为下面的代码时,代码可以完美地运行。但是我不明白原因。希望有人能解释一下。
你期望的结果未能实现是因为你的闭包返回了另一个闭包。

您不能调用取消引用闭包,但可以将其视为一个示例,说明它将如何工作


$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

以下内容无法正常工作:
print_r($k()());

在使用不存在的变量 $y 时,返回一个使用未定义变量的闭包实际上会在原始闭包上创建一个具有空值的静态属性,这就是为什么您看到此输出的原因:
var_dump($u());

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

请注意,如果您在打开错误报告的情况下执行上述操作,您也将收到未定义变量错误。

您似乎已经知道了,但我还是要提一下,$y在闭包内部是无法访问的,因为它在函数的作用域之外。这就是为什么当您使用global进行注册时,它会返回您所期望的内容,也可以从外部闭包中使用use


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接