这个问题可能很愚蠢。但是匿名函数对我来说似乎并不是匿名的。也许我理解它是错误的,但是匿名函数必须存储在某个变量中,因此稍后可以通过此变量引用它。如果是这种情况,是什么使得下面的函数如此匿名或不同于常规函数(除了将函数本身存储在变量中的能力)?或者换句话说,匿名函数如何比常规函数更有用?
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
function greet($name)
{
printf("Hello %s\r\n", $name);
}
$greet('World');
$greet('PHP');
greet('World');
greet('PHP');
?>
答案 0 :(得分:4)
想象一下,您想按用户名对用户列表进行排序。您可以使用匿名函数来代替定义仅使用一次的命名比较函数:
usort($users, function($a, $b) {
return strcmp($a['username'], $b['username']);
});
答案 1 :(得分:2)
函数本身没有名称,正如您在示例中所示,您仍然可以使用“相同名称”创建“真实”函数。它们通常被用作回调,这可能看起来更“匿名”:
foo(function ($bar) { ... });
答案 2 :(得分:1)
关于匿名(或lambda,如果你愿意)函数的一个有用的东西是它们允许用需要它的代码内联创建你的回调函数,而不是设置一个只在那个上下文中使用的全局函数。例如:
$foo = native_function($bar, callback_function);
可以改为:
$foo = native_function($bar, function() { return $bar + 1; } );
关于匿名函数的另一个方便的事情是你设置它的变量每次调用函数,所以它不存储值,而是导出它。如果变量表示某个派生值,那么这很好。例如:
$tax = .1;
$total = function() use (&$price, &$tax) { return $price * (1 + $tax); };
$price = 5.00;
echo $total(); // prints 5.50
$price = $price + 1;
echo $total(); // prints 6.60
$discount = $total() - 2;
echo $discount; // prints 4.60;
您不必每次调用get_total
之类的函数并将其传递给$price
,而是与始终设置为最新值的变量进行交互,因为它每次使用lambda导出该值功能