你怎么知道在闭包中放入什么参数/参数?

时间:2012-06-08 03:00:01

标签: php function closures

闭包何时有参数(或者如何使用参数闭包)?我知道use()用于在匿名函数之外导入变量,但是闭包本身的参数呢?

4 个答案:

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

答案 1 :(得分:2)

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

如果你写的是这个功能,那么你就是控制者,你决定了。

答案 2 :(得分: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()的文档并不那么详细,但我记得还有其他函数除了具有足够的闭包参数文档的callables外。


如果您希望编写自己的函数来接受闭包(或其他可以调用的值)并指定它必须具有哪些参数,则可以使用PHP 5.3中的typehint callback或{{1}在PHP 5.4中。

callable

但是,要指定参数,您需要使用function gobblesUpCallable(callable $func) { call_user_func($func); // Use this, someone could pass in a callable string or array } ReflectionClass,这意味着您可能放弃ReflectionFunction

答案 3 :(得分:2)

use()对于需要函数作为参数的函数特别有用。可能需要传递的函数只接受两个参数,并且简单地忽略任何额外的参数。在这种情况下,使用use()将当前作用域中的变量“导入”到anon函数。

$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

注意:如果您的匿名函数签名为function(&$val, $index, $myvar),那么在使用带有warnings的匿名函数时,您将获得常量array_walk,因为额外的第3个参数未使用且未定义。因此,请使用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