lambda匿名函数是PHP 5.3的一部分。它有什么用?有没有人只能用lambda做什么?对于某些任务,lambda更好吗?
我见过Fibonacci的例子,我真的不需要写Fibonacci序列,所以我仍然不确定它是否对编写webbish应用程序时遇到的各种任务有用。那么在“现实生活”中用它做什么呢?
答案 0 :(得分:79)
任何需要临时功能的东西,你可能只会使用一次。
我会将它们用于回调,例如:
E.g。
usort($myArray, function ($a, $b) {
return $a < $b;
});
在5.3之前,你必须......
function mySort ($a, $b) {
return $a < $b;
}
usort($myArray, 'mySort');
或create_function ...
usort($myArray, create_function('$a, $b', 'return $a < $b;'));
答案 1 :(得分:11)
匿名函数(闭包)可以创建为本地函数(因此不会像Dathan建议的那样对全局空间进行调查)。
使用“use”关键字,可以在闭包内部使用传递给封闭函数或由封闭函数创建的变量。这在其参数列表中受限的回调函数中非常有用。 “use”变量可以在闭包之外定义,无需在每次调用闭包时重新定义它们。
function change_array($arr, $pdo)
{
$keys = array('a', 'c');
$anon_func = function(& $val, $key) use ($keys, $pdo)
{
if (in_array($key, $keys) {
$pdo->query('some query using $key');
$val = $pdo->fetch();
}
}
arr_walk($arr, $anon_func);
return $arr;
}
$pdo = new($dsn, $uname, $pword);
$sample = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$sample = change_array($sample, $pdo);
(当然,这个例子在没有闭包的情况下可以更简单,但它只是用于演示。)
答案 2 :(得分:3)
有些用例通过lambdas更方便。例如,如果方法使用回调,则使用lambda进行回调意味着您不必在某处定义“真实”函数来处理它。所以,lambdas让你的代码更清洁。
如上所述,lambda可以用作“短命”函数。例如,对于a
和b
的任意组合,排序算法通常只需要知道变量a
是否小于变量b
。要制作能够处理任何类对象的通用排序算法,您可以进行排序函数定义,使其接受用作比较器的函数。提供lambda作为比较器函数意味着您可以在每个调用的基础上定义排序行为,而不必定义一个“真实”函数,该函数将在脚本的生命周期中存在,只是为了处理这一个排序情况。 / p>
答案 3 :(得分:3)
尽管可以考虑使用lambda函数的所有用法,但在PHP中它还允许一些非常特殊的称为闭包的东西。这是在当前作用域停止存在后很长时间内使函数可用于当前作用域的能力。
只需提及闭包允许的一些有用模式,就可以实现Memoization (Caching)和Curry。
同样非常有用的是@Matt在他的回答中突出显示的一次性或回调函数。
有关闭包的更多信息,请查看以下问题:How do JavaScript closures work?
答案 4 :(得分:1)
隐秘的Y组合器的实现?
function Y($F)
{
$func = function ($f) { return $f($f); };
return $func(function ($f) use($F)
{
return $F(function ($x) use($f)
{
$ff = $f($f);
return $ff($x);
});
});
}
引用来源:http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures