为什么我要使用匿名函数?我的意思是,使用它的真正优惠是什么? 我真的不明白这一点。我的意思是,你使用函数使代码更干净或多次使用它。但匿名函数不是第一个也不是第二个。 我搜索了他们,我找不到有人问同样的问题。
答案 0 :(得分:60)
我想说,当有好的库类/函数使用它们时,匿名函数会显示它们的美感。他们自己并不那么性感。在.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; }
)
它计算偶数的乘积。
一些哲学。什么是功能?可以调用的功能单元和代码重用单元。有时您只需要第一部分:调用和执行操作的能力,但您根本不想重复使用它,甚至使其对代码的其他部分可见。这就是匿名函数的本质所在。
答案 1 :(得分:21)
特别适用于回调:
array_walk($myArray, function($value, $key) {
// do something
});
答案 2 :(得分:7)
您通常使用匿名函数来执行只需要一次的函数。这样就不会污染函数名称空间,也不会发明奇怪的函数名,如array_walk_callback1
。
答案 3 :(得分:5)
也许最明显的原因是使用回调。以usort()
函数为例。引入单行函数毫无意义,只使用一次和一次。匿名函数(通常)更适合这项任务。
答案 4 :(得分:3)
您可以通过将匿名函数保存在变量中来传递匿名函数。
$a=function() {
echo 'hello world';
};
这意味着您也可以多次使用它们。
答案 5 :(得分:2)
有时你必须使用一个功能。因此,闭包通过不必使用仅在一个地方使用的函数声明填充库来保持代码清洁。闭包类似于style=""
和CSS中的类。当然,你可以为你所拥有的每一种风格创建一大堆类,或者你可以将它们嵌入到位,因为你不在其他地方使用它并减少CSS文件的膨胀。
但这并不是必需的,所以如果您觉得需要明确声明函数,那么您可以自由地执行此操作。
答案 6 :(得分:2)
如果你需要创建一个回调(举一个具体的例子,让我们说它是一个比较函数),匿名函数通常是一个很好的方法。特别是如果函数的定义依赖于少数输入(我的意思是一个闭包,它不是与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
答案 7 :(得分:1)
在我看来,匿名函数最适合用作callbacks函数。许多php array functions都会将这些用作参数。
它们也可用于observer / event listener模式。
答案 8 :(得分:1)
使用jQuery / Javascript,您可以使用它来定义自定义事件回调。看一下jQuery核心如何处理AJAX。
$.ajax({
url: 'ajax/test.html',
complete: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
其他自定义回调的事件是beforeSend
,error
,success
。在authoring custom plugins