PHP面试一战到底
上QQ阅读APP看书,第一时间看更新

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)