我是一个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 />';
以类似的方式,我对下面使用global的代码有一个问题,为什么它不起作用:
$k = function() {
return function() {
global $y;
return $y;
};
};
print_r($k()); // prints out 'Closure Object ( )'
echo '<br />';
请不要告诉我如何交换代码使其工作。正如我所尝试的那样,我知道如何改变并使这些代码工作。相反,我想知道为什么global和use()在另一个匿名函数的返回中调用它们时不起作用。
我知道当我将上面的代码修改为下面的代码时,代码就会完美地工作。但我不明白为什么。希望有人能给我解释一下。
没有像你期望的那样工作的原因是你的闭包返回了另一个闭包。
你不能调用去引用闭包,但是考虑一个它是如何工作的例子:
$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()());
在use $y
不存在的情况下,返回使用未定义变量的闭包的过程实际上在原始闭包上创建了一个带有null值的静态属性,这就是为什么您看到这样的输出:
var_dump($u());
object(Closure)#2 (1) {
["static"]=>
array(1) {
["y"]=>
NULL
}
}
注意如果你在错误报告的情况下执行上述操作,你也会得到一个未定义的变量错误。
你似乎已经意识到,但我无论如何都会提到$y
在闭包内不可访问,因为它在函数的作用域之外。这就是为什么当您使用global
注册它时,它确实返回您所期望的内容,以及当您从外部闭包中use
它时。