4.3 Lambda表达式
4.3.1 概念
Lambda表达式的概念来自于Lambda演算(λ演算,Lambda calculus),最早由阿隆佐·邱奇(Alonzo Church)在1930年提出的。Lambda演算是数学逻辑中的一种形式系统,用于表示基于函数抽象的计算和使用变量绑定和替换的应用。
Lambda表达式有三个要素,如表4-1所示。
表4-1 Lambda表达式的三要素
我们拿计算平方来举例:y=x2,其中变量为x,抽象为x2,计算5的平方为实际应用。用PHP实现的示例代码如下:(源码文件:ch04/lambda/square.php)
第1行定义了$square的lambda表达式,变量(参数)为x。
第2行为实际应用,计算52=25。
定义Lambda表达式的语法如下:
function & (parameters) use (lexical vars) { body }
例如上例定义的$square。语法中的&是可选的,表示返回一个引用类型的值,一般不推荐使用。
定义Lambda表达式之后有三种调用方式:
$square(5); call_user_func ($square,5); call_user_func_array ($square, array (5));
4.3.2 匿名函数、闭包和Lambda表达式的关系
匿名函数是基础概念,指没有名称的函数,而闭包和Lambda表达式都是基于匿名函数的概念。
Lambda表达式和闭包并没有非常大的差别,PHP语法中它们的定义如下:
lambda 表达式 function & (parameters) use (lexical vars) { body } 闭包 function (normal parameters) use ($var1, $var2, &$refvar) {}
它们的主要差别在于使用场景上。
Lambda表达式为用变量表示的匿名函数,甚至直接以inline书写的函数也可以当作Lambda表达式。
闭包为包含执行上下文环境的匿名函数或Lambda表达式。
三者之间的关系如图4-1所示。
图4-1 闭包、匿名函数和Lambda表达式的关系
请注意三者的区别与联系,各种资料众说纷纭,以上的结论笔者参考了维基百科和PHP官方wiki,有兴趣的读者可以详读一下。
参考链接:
https://wiki.php.net/rfc/closures
https://en.wikipedia.org/wiki/Lambda_calculus
https://en.wikipedia.org/wiki/Closure_(computer_programming)