“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中没有例子。
答案 0 :(得分:24)
一个闭包是php中的一个lambda函数,它封装了变量,因此一旦它们的原始引用超出范围就可以使用它们。
闭包是一个lambda函数,但除非指定use
关键字,否则lambda函数不是闭包。
答案 1 :(得分:5)
将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";
});
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更聪明,因为它能够与来自外部环境的变量进行交互。