PHP-为什么使用匿名函数?

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

为什么要使用匿名函数? 我的意思是,使用它的真正意义是什么?我只是真的不明白这一点。 我的意思是,您使用函数来使代码更清晰或更多次使用。 但是匿名函数只是不执行第一个也不执行第二个。我用谷歌搜索,但找不到有人问同样的问题。

9个解决方案
60 votes

我想说的是,当有良好的库类/函数使用匿名函数时,它们会显示出它们的美丽。 他们自己并不那么性感。 在.net世界中,有一种称为LINQ的技术,它以非常惯用的方式大量使用了那时。 现在回到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; }
)

它计算偶数乘积。

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

Andrey answered 2020-06-30T04:35:27Z
21 votes

这对回调尤其有用:

array_walk($myArray, function($value, $key) {
   // do something
});
netcoder answered 2020-06-30T04:35:47Z
7 votes

通常,对于仅需要一次的功能,请使用匿名功能。 这样,您就不会污染函数名称空间,也不会发明奇怪的函数名称,例如array_walk_callback1

NikiC answered 2020-06-30T04:36:08Z
5 votes

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

Mchl answered 2020-06-30T04:36:28Z
3 votes

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

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

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

bcosca answered 2020-06-30T04:36:52Z
2 votes

如果您需要创建一个回调(举一个具体的例子,可以说它是usort的比较函数),匿名函数通常是一个不错的选择。 特别是如果函数的定义依赖于一些输入(我的意思是闭包,这与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
jon_darkstar answered 2020-06-30T04:37:13Z
2 votes

有时您必须使用函数。 因此,闭包不必使用只在一个地方使用的函数声明来填充库,从而使代码保持干净。 闭包类似于CSS中的style=""和类。 当然,您可以为每种样式创建一个类的负载,也可以将它们嵌入到位,因为您无需在其他地方使用它,从而减少CSS文件的膨胀。

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

methodin answered 2020-06-30T04:37:38Z
1 votes

我认为,匿名函数最好用作函数的回调。 许多php数组函数将使用这些作为参数。

它们也可以用于观察者/事件监听器模式。

gnarf answered 2020-06-30T04:38:02Z
1 votes

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

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

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

其他带有自定义回调的事件是beforeSenderrorsuccess。创作自定义插件时,您可以充分利用此灵活的事件回调系统

Derek Adair answered 2020-06-30T04:38:31Z
translate from https://stackoverflow.com:/questions/4147400/why-use-anonymous-function