在PHP中lambda有什么用?
lambda匿名函数是PHP 5.3的一部分。 它有什么用途? 有什么只能用lambda做的吗? lambda更适合某些任务吗?
我已经看过斐波那契的例子了,我实际上不需要写Fibonacci序列,所以我仍然不确定它是否对我在编写webbish应用程序时遇到的任务有用。 那么在“现实生活”中,人们做了什么呢?
任何需要暂时的function,你可能只会使用一次。
我会使用它们进行callback,例如:
- usort
- preg_replace_callback
例如
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;'));
匿名函数(闭包)可以创build为本地函数(因此不会像Dathan所build议的那样对全局空间进行轮询)。
使用“use”关键字,可以在闭包中使用传递给或由闭包函数创build的variables。 在参数列表中有限的callback函数中,这非常有用。 可以在闭包之外定义“使用”variables,无需在每次调用闭包时重新定义它们。
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);
(当然,这个例子可以更简单,没有closures,但它只是演示。)
有一些使用lambdaexpression式更方便的用例。 例如,如果一个方法使用callback,那么使用lambda表示callback意味着你不必在某个地方定义一个“真实”的函数来处理它。 所以,lambda保持你的代码更清洁。
和上面一样,lambda可以用作“短命”function。 例如,对于a
和b
任意组合,sortingalgorithm通常只需要知道variablesa
是否小于variablesb
。 为了使通用的sortingalgorithm能够处理任何类的对象,你可以使你的sorting函数定义,使它接受一个函数作为比较。 提供一个lambda作为比较函数意味着你可以在每个调用的基础上定义你的sorting行为,而不必定义一个“真正的”函数,这个函数在你的脚本的整个生命周期中只处理这一个sorting情况。
尽pipe所有的lambda函数都可以使用,但在PHP中它也允许一些非常特殊的闭包。 这是在当前范围停止存在之后很长时间内可以使当前范围内的variables可用的function。
只要提到一些有用的模式,闭包允许你,可以实现Memoization(caching)和咖喱 。
@Matt在回答中强调的丢弃或callback函数也非常有用。
有closures包的更多信息,请查看以下问题: JavaScript闭包如何工作?
神秘的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