15

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

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

虽然帖子“闭包”和“lambda”有什么区别?有一些答案(例如,lambda 只是一个匿名函数,而闭包是一个可以访问不在其参数列表中的变量的函数),似乎特定于 Python 编程语言(其中提到了 Scheme编程语言)。例如,根据帖子,在 Python 中,似乎可以有不是 lambda 的闭包和不是闭包的 lambda。

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

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

所有这一切都令人困惑。虽然我假设 lambda 函数通常只是未命名的函数,但以下 Wikipedia 文章更多地介绍了闭包:

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

尽管在 PHP 中没有示例。

4

5 回答 5

24

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

闭包是 lambda 函数,但 lambda 函数不是闭包,除非您指定use关键字。

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

于 2013-11-12T14:08:16.060 回答
7

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

使用 lambda

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

// 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";
});

什么是闭包?

闭包本质上与 Lambda 相同,只是它可以访问其创建范围之外的变量。

例如:

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

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

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

正如您在上面看到的,闭包能够访问该$user变量,因为它是在闭包函数定义的 use 子句中声明的。

如果您要更改$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

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

于 2017-01-04T06:36:36.563 回答
3

有一篇 PHP 特定的文章,有详细的解释和代码示例: http ://www.ibm.com/developerworks/library/os-php-5.3new2/

断开链接警告:截至 2014-10-18,以上链接为 404。我从 Google 缓存中复制了文章并放在这里

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

于 2014-05-07T15:57:13.227 回答
0

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

这就是它的强大用途,您可以在没有依赖全局命名空间的常规函数​​的情况下更轻松地增加/减少这样的东西或创建斐波那契或迭代生成器函数。

Lambda 不支持use,因此它们不能包含外部范围的变量。闭包也可以被缓存,因此它提高了编译性能。

于 2016-09-17T16:48:30.170 回答
0

功能

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

匿名函数

  • 一个没有名字的函数。
  • 它不一定需要创建一个闭包。

拉姆达

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

关闭

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

         

于 2017-09-03T09:58:20.510 回答