闭包什么时候有参数(或者带参数的闭包如何工作)?我知道这use()
是用来在匿名函数之外导入变量的,但是闭包本身的参数呢?
4 回答
带参数的闭包的一个例子是柯里化:
function greeter($greeting)
{
return function($whom) use ($greeting) {
// greeting is the closed over variable
return "$greeting $whom";
};
}
$hello_greeter = greeter('hello');
echo $hello_greeter('world'); // will print 'hello world';
该greeter
函数将返回一个“半实现”的函数,该函数总是以相同的问候开始,然后是传递给它的任何内容(例如要问候的人)。
如果您使用的函数接受匿名函数作为参数,请检查函数的文档。
如果函数是由您编写的,那么您就是控制器,由您决定。
文档中详细介绍了传递给应该具有参数的 PHP 函数的闭包。一个很好的例子是array_walk()
,它用于将回调应用到可迭代对象:
$arr = array('a', 'b', 'c');
array_walk($arr, function($key, $val) {
echo $key . ' => ' . $val . "\n";
});
在文档中,您应该在传递给的可调用对象中包含的array_walk()
参数在“参数”下进行了详细说明。它说:
通常,funcname 有两个参数。数组参数的值是第一个,键/索引是第二个。
通常,您会在 PHP 文档中找到有关其他函数的类似提示。令我失望的是文档array_map()
没有那么详细,但我记得还有其他函数除外具有足够闭包参数文档的可调用函数。
如果您希望编写自己的函数来接受闭包(或您可以调用的其他值)并指定它必须具有的参数,您可以使用callback
PHP 5.3 或callable
PHP 5.4 中的类型提示。
function gobblesUpCallable(callable $func) {
call_user_func($func); // Use this, someone could pass in a callable string or array
}
但是,要指定参数,您需要使用ReflectionClass
orReflectionFunction
这意味着您可能会放弃call_user_func()
.
use()
对于需要函数作为参数的函数特别有用。可能要求传递的函数只接受两个参数,并且简单地忽略任何额外的参数。在这种情况下,使用use()
将变量从当前范围“导入”到匿名函数。
$myvar = 10;
$fun = function(&$val, $index) use ($myvar) {$val += $myvar;};
$testArray = array(1,2,3);
array_walk($testArray, $fun);
var_dump($testArray); // 11, 12, 13
注意:如果您的 anon 函数签名是相反的,那么在使用 anon 函数时function(&$val, $index, $myvar)
您会得到常量,因为额外的第三个参数未使用且未定义。因此,请改用传递该额外参数。warnings
array_walk
use()
编辑:您也可以通过引用传递变量use()
...
$myvar = 10;
$fun = function(&$val, $index) use (&$myvar) {$myvar = 1; $val += $myvar;};
$testArray = array(1,2,3);
array_walk($testArray, $fun);
var_dump($testArray); // 2, 3, 4
echo $myvar; // 1