我是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()不起作用。
感谢您帮助我澄清使用/全球如何运作的想法。
答案 0 :(得分:1)
我知道当我将上面的代码修改为下面的代码时,代码就能完美运行。但我不明白原因。希望有人可以向我解释。
它没有按预期工作的原因是因为你的闭包正在返回另一个闭包。
您不能调用de-reference闭包,但请考虑it will work的示例:
$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
}
}
注意如果您使用error reporting on执行上述操作,您也会收到未定义的变量错误。
您似乎已经意识到了,但无论如何我都会提到$y
在封闭内部无法访问,因为它超出了函数的范围。这就是为什么当你使用global
注册它时它会返回你期望的内容,以及当你从外部封闭中use
时它。