Php 您如何知道在闭包中放置哪些参数/参数?

Php 您如何知道在闭包中放置哪些参数/参数?,php,function,closures,Php,Function,Closures,闭包何时具有参数(或者具有参数的闭包如何工作)?我知道use()用于在匿名函数之外导入变量,但是闭包本身的参数呢?如果您使用的函数接受匿名函数作为参数,请检查函数的文档 如果函数是由您编写的,那么您就是控制器,由您决定。带有参数的闭包示例如下: function greeter($greeting) { return function($whom) use ($greeting) { // greeting is the closed over variable return

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

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


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

带有参数的闭包示例如下:

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函数的闭包,这些函数应该有参数。一个很好的例子是,它用于将回调应用于iterable:

$arr = array('a', 'b', 'c');
array_walk($arr, function($key, $val) {
    echo $key . ' => ' . $val . "\n";
});
在文档中,您应该在传递给
array\u walk()
的可调用文件中包含的参数在“参数”下有详细说明。它说:

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

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


如果您希望编写自己的函数来接受闭包(或您可以调用的其他值)并指定它必须具有的参数,那么可以使用PHP5.3中的typehint
callback
,或PHP5.4中的
callable

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

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
注意:如果您的anon函数签名是
函数(&$val,$index,$myvar)
,那么在将anon函数与
数组一起使用时,您将得到持续的
警告,因为额外的第三个参数未使用且未定义。因此,使用
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

你肯定是从“使用”这个词中赚到了钱<代码>;)
@JaredFarrish
用法
用于将变量导入匿名函数的作用域。像
$fuc=function($a,$b)use($c){}
之类的东西;我更熟悉Javascript闭包,但是为了解决“为什么或者什么时候闭包中有参数?”的问题,我会说,什么时候匹配传入的签名(比如在处理程序中),或者作为参数传递更方便或有用。评论?@JaredFarrish PHP的结尾与javascript略有不同。当您在外部使用变量时,您需要使用
use
。是的,我正在阅读手册,我意识到我需要仔细阅读。当然,与Javascript不一样。@JaredFarrish这里提到的
用法与名称空间没有任何关系。@JaredFarrish在这里阅读:示例#3@JaredFarrish好的,虽然没有太大的不同:)@JaredFarrish我看不到它们,尽管这是因为我修复了它们。缺少一个
$
。@JaredFarrish我明白了。。。好的,谢谢:)从JS到PHP的变形代码很容易搞乱up@JackSpairowgah,我应该在PHP=XI中重新开始,但我不会称之为闭包,它不会结束任何事情;相反,它是一个匿名函数。。同样,PHP中的术语“closure”是不明确的:)@PhpMyCoder
只能通过引用传递变量
@Jack-参考手册,第一个示例与这里的示例相同,只是它使用了不同的函数。这个例子怎么了?回调应该是第二个参数,谢谢你们。@JackSpairow最初我打算使用
array\u map()
,但当我注意到可调用的文档非常稀疏时,我切换到
array\u walk()
,但忘了交换参数。抢手货