闭包何时有参数(或者如何使用参数闭包)?我知道use()
用于在匿名函数之外导入变量,但是闭包本身的参数呢?
答案 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