lambda函数和闭包之间的区别(在PHP中)?

时间:2013-11-12 14:00:11

标签: php lambda closures php-closures

“Magento PHP开发人员指南”的第2章声明:

  

Zend Framework 2使用100%面向对象的代码并使用大部分代码   PHP 5.3的新功能,即命名空间,后期静态绑定,   lambda函数和闭包。

虽然帖子What is the difference between a 'closure' and a 'lambda'?有一些答案(例如,一个lambda只是一个匿名函数,而一个闭包是一个可以访问不在其参数列表中的变量的函数),但似乎是特定于Python编程语言(稍微提到了Scheme编程语言)。 例如,根据帖子,在Python中,似乎可以有闭包不是lambda,而lambdas不是闭包。

但是,我对PHP编程语言感兴趣,而不是Python。下面的答案之一似乎指出,在PHP中,所有的闭包都是lambdas,这与Python中与Python相关的帖子相冲突。

在我看来,这些概念在语言和语言的细节上有所不同,我对PHP感兴趣,因此这篇文章。

所有这一切都令人困惑。虽然我认为lambda函数通常只是未命名的函数,但下面的维基百科文章更多地讨论了闭包:

http://en.wikipedia.org/wiki/Closure_%28computer_science%29

虽然在PHP中没有例子。

5 个答案:

答案 0 :(得分:24)

一个闭包是php中的一个lambda函数,它封装了变量,因此一旦它们的原始引用超出范围就可以使用它们。

闭包是一个lambda函数,但除非指定use关键字,否则lambda函数不是闭包。

这是一个更好的答案:https://stackoverflow.com/a/220728/1152375

答案 1 :(得分:5)

将Lambda函数分配给变量或作为参数传递给另一个函数。闭包使用来自他们范围之外的变量。

使用lambdas

因为该函数没有名称,所以不能像常规函数那样调用它。相反,您必须将其分配给变量或将其作为参数传递给另一个函数。

// Anonymous function
// assigned to variable
$greeting = function () {
  return "Hello world";
}

// Call function
echo $greeting();
// Returns "Hello world"

要使用匿名函数,我们将其分配给变量,然后将该变量作为函数调用。

您也可以将该函数传递给另一个函数,如下所示:

// Pass Lambda to function
function shout ($message){
  echo $message();
}

// Call function
shout(function(){
  return "Hello world";
});

什么是关闭?

Closure与Lambda基本相同,除了它可以访问创建范围之外的变量。

例如:

// Create a user
$user = "Philip";

// Create a Closure
$greeting = function() use ($user) {
  echo "Hello $user";
};

// Greet the user
$greeting(); // Returns "Hello Philip"

如上所示,Closure能够访问$user变量,因为它是在Closure函数定义的use子句中声明的。

如果您要更改Closure中的$user变量,它将不会影响原始变量。要更新原始变量,我们可以附加一个&符号。变量之前的&符号表示这是一个引用,因此原始变量也会更新。

For example:
// Set counter
$i = 0;
// Increase counter within the scope
// of the function
$closure = function () use ($i){ $i++; };
// Run the function
$closure();
// The global count hasn't changed
echo $i; // Returns 0

// Reset count
$i = 0;
// Increase counter within the scope
// of the function but pass it as a reference
$closure = function () use (&$i){ $i++; };
// Run the function
$closure();
// The global count has increased
echo $i; // Returns 1

本文是>>的Philip Brown文章的一部分。 culttt.com。你可以在那里找到更多的例子。

答案 2 :(得分:3)

有一篇特定于PHP的文章,其中包含详细说明和代码示例: http://www.ibm.com/developerworks/library/os-php-5.3new2/

断链警告:截至2014-10-18,上述链接为404。 我从Google缓存中复制了该文章并放置了here

如果您发现原始文档重新出现在任何地方,请告诉我。

答案 3 :(得分:0)

闭包实际上意味着如果你use一个变量,它的值将被用在一个封闭的函数中,而不会在它之外更新它的值。如果要更新已使用变量的值但是作为普通参数,则必须使用引用运算符&

这是强大的用途,你可以在/减少这样的事情或创建fibonaccis或迭代生成器函数更容易,而不依赖于全局命名空间的常规函数​​。

Lambdas不支持use因此它们不能包含外部作用域中的变量。闭包也可以缓存,因此它可以提高编译性能。

答案 4 :(得分:0)

<强>功能

  • 一段以参数形式接受一个或多个输入的代码,进行一些处理并返回一个值。
  • 它应该有一个名称,需要时可以通过它的名字来调用。
  • 可以在一个类中包含多个函数(允许具有相同名称的多个函数等等)。

匿名函数

  • 没有名字的功能。
  • 不一定需要创建闭包。

<强> LAMBDA

  • 一个匿名函数,可以分配给变量或作为参数传递给其他函数。
  • 它不能像常规函数那样被调用,因为它没有名称,它必须将其分配给变量或将其作为参数传递给另一个函数。因此它变成了Lambda函数。
  • 它很有用,因为它们是一个丢弃的功能,你可以在某个地方使用一次,而不需要在很多地方重复使用它。

<强>封闭

  • 与Lambda相同。但它可以从外部范围访问变量而不使用全局变量。 (它可以捕捉周围环境的状况)。
  • 可以使用“use”语法以干净的方式解决变量范围限制。 (基本上它是一个使用语法的匿名函数)。
  • 它不是仅为匿名函数创建的。
  • 它比Lambda更聪明,因为它能够与来自外部环境的变量进行交互。