为什么使用匿名函数?

可能重复:
你如何在PHP中使用匿名函数?

为什么我应该使用匿名函数? 我的意思是,使用它的真正的交易是什么? 我只是不明白这一点。 我的意思是,你使用函数来使代码更干净或不止一次地使用它。 但匿名函数只是不做第一和第二。 我GOOGLE了他们,我找不到任何人问同样的问题。

我会说,当有很好的库类/函数使用它们时,匿名函数会显示它们的美丽。 他们自己并不那么性感。 在.net的世界里,有一种叫做LINQ的技术,在非常地道的方式中被广泛使用。 现在回到PHP。

第一个例子,sorting:

uasort($array, function($a, $b) { return($a > $b); }); 

您可以指定复杂的逻辑进行sorting:

 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; } ) 

它计算偶数的乘积。

一些哲学。 什么是function? 可以调用的function单元和代码重用单元。 有时候你只需要第一部分:调用和执行动作的能力,但是你根本不想重用它,甚至可以让其他部分的代码看到它。 这就是匿名函数实质上所做的。

这对callback尤其有用:

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

通常对于只需要一次的函数使用匿名函数。 这样你就不会污染函数名字空间,也不会像array_walk_callback1一样发明奇怪的函数名字。

也许最明显的原因是使用callback。 以usort()函数为例。 引入单行函数是没有意义的,只能使用一次。 匿名函数(通常)更适合这个任务。

您可以通过将匿名函数保存在variables中来传递。

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

这意味着你也可以多次使用它们。

如果你需要创build一个callback函数(举一个具体的例子,可以说它是一个用于usort的比较函数),匿名函数通常是一个好的方法。 特别是如果函数的定义是依赖于一些input(我的意思是一个闭包,它不是anon函数的同义词)

 function createCallback($key, $desc = false) { return $desc ? function($a, $b) use ($key) {return $b[$key] - $a[$key];} : function($a, $b) use ($key) {return $a[$key] - $b[$key];}; } usort($myNestedArray, createCallback('age')); //sort elements of $myNestedArray by key 'age' ascending usort($myNestedArray, createCallback('age', true); //descending 

有些时候你必须使用一个函数。 因此,闭包保持代码的清洁,不需要用只在一个地方使用的函数声明来填充函数库。 闭包类似于CSS中的style=""和类。 当然,你可以为每一种风格创build一大堆类,或者你可以将它们embedded到位,因为你不会在其他地方使用它并减lessCSS文件的膨胀。

但是,这并不是必要的,所以如果你觉得需要明确地声明函数,你可以自由地做到这一点。

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

他们也可以用在观察者/事件监听模式中。

使用jQuery / Javascript,您可以使用它来定义自定义事件callback。 看看jQuery核心如何处理AJAX 。

使用匿名函数进行事件callback的jQuery示例:

 $.ajax({ url: 'ajax/test.html', complete: function(data) { $('.result').html(data); alert('Load was performed.'); } }); 

其他事件w /自定义callback是beforeSenderrorsuccess 。 编写自定义插件时,您可以充分利用这个灵活的事件callback系统