使用/ global函数返回匿名函数的PHP函数
我是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 />';
请不要告诉我如何交换代码以使其工作。 正如我所尝试过的,我知道如何改变并使这些代码起作用。 相反,我想知道为什么全局和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
不存在时use $y
的情况下,返回使用未定义变量的闭包的过程实际上会在原始闭包中创建一个静态属性,其值为空值,这就是为什么您会看到以下输出:
var_dump($u());
object(Closure)#2 (1) {
["static"]=>
array(1) {
["y"]=>
NULL
}
}
请注意,如果您使用错误报告进行上述操作,您也会收到未定义的变量错误。
你似乎已经知道了,但是我会提到$y
在闭包内部是不可访问的,因为它在函数的范围之外。 这就是为什么当你使用global
注册它时,它会返回你期望的结果,并且当你从外部结束时use
它。
上一篇: PHP function returning anonymous function with use / global
下一篇: PHP closure functions: why does a closure have to be an anonymous function?