4

闭包什么时候有参数(或者带参数的闭包如何工作)?我知道这use()是用来在匿名函数之外导入变量的,但是闭包本身的参数呢?

4

4 回答 4

3

带参数的闭包的一个例子是柯里化:

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函数将返回一个“半实现”的函数,该函数总是以相同的问候开始,然后是传递给它的任何内容(例如要问候的人)。

于 2012-06-08T03:12:38.397 回答
2

如果您使用的函数接受匿名函数作为参数,请检查函数的文档。

如果函数是由您编写的,那么您就是控制器,由您决定。

于 2012-06-08T03:03:25.743 回答
2

文档中详细介绍了传递给应该具有参数的 PHP 函数的闭包。一个很好的例子是array_walk(),它用于将回调应用到可迭代对象:

$arr = array('a', 'b', 'c');
array_walk($arr, function($key, $val) {
    echo $key . ' => ' . $val . "\n";
});

在文档中,您应该在传递给的可调用对象中包含的array_walk()参数在“参数”下进行了详细说明。它说:

通常,funcname 有两个参数。数组参数的值是第一个,键/索引是第二个。

通常,您会在 PHP 文档中找到有关其他函数的类似提示。令我失望的是文档array_map()没有那么详细,但我记得还有其他函数除外具有足够闭包参数文档的可调用函数。


如果您希望编写自己的函数来接受闭包(或您可以调用的其他值)并指定它必须具有的参数,您可以使用callbackPHP 5.3 或callablePHP 5.4 中的类型提示。

function gobblesUpCallable(callable $func) {
    call_user_func($func); // Use this, someone could pass in a callable string or array
}

但是,要指定参数,您需要使用ReflectionClassorReflectionFunction这意味着您可能会放弃call_user_func().

于 2012-06-08T03:22:03.967 回答
2

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)您会得到常量,因为额外的第三个参数未使用且未定义。因此,请改用传递该额外参数。warningsarray_walkuse()

编辑:您也可以通过引用传递变量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
于 2012-06-08T03:23:30.650 回答