Joh*_*son 15 php lambda closures php-closures
"Magento PHP Developer's Guide"的第2章指出:
Zend Framework 2使用100%面向对象的代码并利用PHP 5.3的大多数新功能,即命名空间,后期静态绑定,lambda函数和闭包.
虽然帖子'封闭'和'lambda'之间有什么区别?有一些答案(例如,一个lambda只是一个匿名函数,并且一个闭包是一个可以访问不在其参数列表中的变量的函数),似乎特定于Python编程语言(有一些提到Scheme编程语言).例如,根据帖子,在Python中,似乎可以有不是lambdas的闭包,而不是闭包的lambdas.
但是,我对PHP编程语言感兴趣,而不是Python.下面的答案之一似乎指出,在PHP中,所有闭包都是lambdas,这与与Python相关的帖子相冲突.
在我看来,这些概念在语言和语言的细节上有所不同,我对PHP感兴趣,因此这篇文章.
所有这一切都令人困惑.虽然我认为lambda函数通常只是未命名的函数,但下面的维基百科文章更多地讨论了闭包:
http://en.wikipedia.org/wiki/Closure_%28computer_science%29
虽然在PHP中没有例子.
gh1*_*man 24
闭包是php中的lambda函数,它封装了变量,因此一旦它们的原始引用超出范围就可以使用它们.
闭包是一个lambda函数,但除非指定use关键字,否则lambda函数不是闭包.
这是一个更好的答案:https://stackoverflow.com/a/220728/1152375
Lambda函数被赋值给变量或作为参数传递给另一个函数.闭包使用来自他们范围之外的变量.
因为该函数没有名称,所以不能像普通函数那样调用它.相反,您必须将其分配给变量或将其作为参数传递给另一个函数.
// Anonymous function
// assigned to variable
$greeting = function () {
return "Hello world";
}
// Call function
echo $greeting();
// Returns "Hello world"
Run Code Online (Sandbox Code Playgroud)
为了使用匿名函数,我们将它分配给变量,然后将该变量作为函数调用.
您还可以将该函数传递给另一个函数,如下所示:
// Pass Lambda to function
function shout ($message){
echo $message();
}
// Call function
shout(function(){
return "Hello world";
});
Run Code Online (Sandbox Code Playgroud)
Closure基本上与Lambda相同,除了它可以访问创建它的范围之外的变量.
例如:
// Create a user
$user = "Philip";
// Create a Closure
$greeting = function() use ($user) {
echo "Hello $user";
};
// Greet the user
$greeting(); // Returns "Hello Philip"
Run Code Online (Sandbox Code Playgroud)
如上所示,Closure能够访问$user变量,因为它是在Closure函数定义的use子句中声明的.
如果要$user在Closure中更改变量,则不会影响原始变量.要更新原始变量,我们可以附加一个&符号.变量之前的&符号表示这是一个引用,因此原始变量也会更新.
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
Run Code Online (Sandbox Code Playgroud)
本文是Philip Brown在>> culttt.com上发表文章的一部分.你可以在那里找到更多的例子.