首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lambda函数和闭包之间的区别(在PHP中)?

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

Stack Overflow用户
提问于 2013-11-12 14:00:11
回答 5查看 13.8K关注 0票数 15

"Magento PHP开发人员指南“第2章规定:

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

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

然而,我对PHP编程语言感兴趣,而不是Python。下面的一个答案似乎指出,在PHP中,所有的闭包都是lambdas,这与文章中与Python状态有关的内容相冲突。

在我看来,这些概念因语言而异,我对PHP很感兴趣,因此我发表了这篇文章。

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

科学/29

虽然PHP中没有示例。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-12 14:08:16

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

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

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

票数 25
EN

Stack Overflow用户

发布于 2017-01-04 06:36:36

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

使用羔羊

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

代码语言:javascript
复制
// Anonymous function
// assigned to variable
$greeting = function () {
  return "Hello world";
}

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

因此,要使用匿名函数,我们将其赋值给一个变量,然后将该变量作为函数调用。

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

代码语言:javascript
复制
// Pass Lambda to function
function shout ($message){
  echo $message();
}

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

什么是结束?

闭包与Lambda本质上是一样的,除了它可以访问它创建的作用域之外的变量。

例如:

代码语言:javascript
复制
// 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变量,则不会影响原始变量。要更新原始变量,我们可以附加一个符号。变量之前的一个符号表示这是一个引用,因此原始变量也会被更新。

代码语言:javascript
复制
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文章的一部分。你可以在那里找到更多的例子。

票数 8
EN

Stack Overflow用户

发布于 2014-05-07 15:57:13

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19931170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档