Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么要使用匿名函数?_Php_Design Patterns_Closures_Anonymous Function - Fatal编程技术网

Php 为什么要使用匿名函数?

Php 为什么要使用匿名函数?,php,design-patterns,closures,anonymous-function,Php,Design Patterns,Closures,Anonymous Function,可能重复: 为什么要使用匿名函数?我是说,使用它的真正意义是什么? 我真的不明白。我的意思是,您使用函数使代码更干净,或者多次使用它。但是匿名函数既不做第一步,也不做第二步。 我在谷歌上搜索了他们,没有发现有人问同样的问题。这对回调特别有用: array_walk($myArray, function($value, $key) { // do something }); 也许最明显的原因是使用回调。以usort()函数为例。引入一行函数是没有意义的,它只会被使用一次。匿名函数(通常)

可能重复:

为什么要使用匿名函数?我是说,使用它的真正意义是什么? 我真的不明白。我的意思是,您使用函数使代码更干净,或者多次使用它。但是匿名函数既不做第一步,也不做第二步。
我在谷歌上搜索了他们,没有发现有人问同样的问题。

这对回调特别有用:

array_walk($myArray, function($value, $key) {
   // do something
});

也许最明显的原因是使用回调。以
usort()
函数为例。引入一行函数是没有意义的,它只会被使用一次。匿名函数(通常)更适合此任务。

有时您必须使用函数。因此,闭包不必用只在一个地方使用的函数声明来填充库,从而保持代码的整洁。闭包类似于CSS中的
style=”“
和类。当然,您可以为您拥有的每一种样式创建一大堆类,或者您可以将它们嵌入到适当的位置,因为您不在其他地方使用它们,从而减少CSS文件的膨胀


不过,这不是必须的,因此如果您觉得需要显式声明函数,您可以自由地这样做。

对于只需要一次的函数,您通常使用匿名函数。这样,您就不会污染函数名称空间,也不会发明奇怪的函数名,如
array\u walk\u callback1

您可以通过将匿名函数保存在变量中来传递它们

$a=function() {
    echo 'hello world';
};

这意味着您还可以多次使用它们。

在我看来,匿名函数最适合用作函数。许多php将使用这些作为参数


它们也可以在模式中使用。

如果您需要创建回调(为了制作一个具体的示例,假设它是usort的比较函数),匿名函数通常是一种很好的方法。特别是如果函数的定义依赖于几个输入(我指的是闭包,它不是anon函数的同义词)


我想说的是,当有好的库类/函数使用匿名函数时,匿名函数就会显示出它们的美丽。她们本身并没有那么性感。在.net的世界里,有一种叫做LINQ的技术,它以非常惯用的方式大量使用了then。现在回到PHP

第一个示例,排序:

uasort($array, function($a, $b) { return($a > $b); });
您可以指定用于排序的复杂逻辑:

uasort($array, function($a, $b) { return($a->Age > $b->Age); });
另一个例子:

$data = array( 
        array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'), 
        array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'), 
        array('id' => 3, 'name' => 'James', 'position' => 'Director') 
); 

$names = array_map( 
        function($person) { return $person['name']; }, 
        $data 
);
您可以看到生成名称数组的效果有多好

最后一个:

array_reduce(
   array_filter($array, function($val) { return $val % 2 == 0; },
   function($reduced, $value) { return $reduced*$value; }
)
它计算偶数的乘积

一些哲学。什么是函数?可以调用的功能单元和代码重用单元。有时,您只需要第一部分:调用和执行操作的能力,但您根本不想重用它,甚至不想让它对代码的其他部分可见。这就是匿名函数的基本功能。

使用/Javascript,您可以使用它定义自定义事件回调。看看jQuery核心是如何处理的

jQuery使用匿名函数进行事件回调的示例:
其他带有自定义回调的事件有
发送前
错误
成功
。当

时,您可以充分利用这个灵活的事件回调系统,但是如果我只使用一次该函数,为什么不应该声明任何函数呢?既不是普通的,也不是匿名的?你真的希望你的HTML被描述呈现的标签污染,而不是内容吗?当你必须使用函数时,匿名函数会有所帮助,比如在usort、array\U map等。。。在这些情况下,传统上您必须在代码中的某个位置创建函数,并在中传递函数的名称。使用匿名函数,您可以动态声明它。它也有助于回调。您的示例似乎表明,您认为匿名函数只是对代码进行分组的一种方式——它们可以是,但这不是它们的真正用途。@charlie有时您需要一个函数作为参数传入。这就是人们提到回调的原因。当使用回调时,您必须向回调传递一个函数。@rox0r我知道了,但您也可以使用函数名为callback的字符串。无论如何,谢谢,我知道。希望你永远不要发明那些奇怪的函数名。像
returnUsefulDataFromArray
这样的东西会更有用:)它比
foreach
更好吗?这是一个毫无意义的例子。它显示了使用另一个构造可以更容易地完成的事情。它没有显示匿名函数的有用性。真的,OP没有问什么更好。它问它有什么用处。答案是:回调。如果你想提供1000个例子,请在自己的答案中自由选择。“它问它有什么用处。”在你的例子中,它们根本没有用处。我不是说你应该提供1000个例子。一个就够了,但要有代表性和相关性。@Andrey:如果你觉得我的答案不够有用,不要投反对票,并提供你认为更好的答案。故事结束。你能从标题中删除闭包吗?这与你的问题有点相切。@rox0r-你真的认为闭包是不相关的吗?对我来说似乎是合适的,所以我以我希望对演示有用的方式将其纳入我的答案中。显然,可以使用不带闭包的lambda funcs,但不能使用反之亦然-versa@jon当前位置我认为它们是相关的,但他的意图似乎集中在刚刚命名的vs anon.函数上。我认为你提到闭包是件好事,我只是认为它在标题中有误导性。为什么不直接声明一个函数呢?“不止一次”。您不能多次使用常规函数吗?您应该记住,声明的函数是全局函数,而匿名函数不是。您不希望使用一次性和琐碎的函数污染全局命名空间。因此,可以使用
unset
销毁变量函数,而globa
array_reduce(
   array_filter($array, function($val) { return $val % 2 == 0; },
   function($reduced, $value) { return $reduced*$value; }
)
$.ajax({
  url: 'ajax/test.html',
  complete: function(data) {
    $('.result').html(data);
    alert('Load was performed.');
  }
});