PHP闭包与匿名函数

先看一下什么是匿名函数:

$closure = function ($name) {
return sprintf('Hello %s', $name);
};
echo $closure('Yee Jason');

匿名函数:就是没有名称的函数。 PHP的匿名函数其本身是伪装成函数的对象,实现了__invoke() 魔术方法,只要变量后面有(),php就会调用__invoke()方法

在PHP中,匿名函数最典型的应用莫过于作为回调函数使用。

$numberPlusOne = array_map(function($number) {
return $number + 1;
}, [1, 2, 3]);
print_r($numberPlusOne);

我们再来看一看什么是闭包:

function enclosePerson($name)
{
    return function ($doCommand) use ($name) {
        return sprintf('%s, %s', $name, $doCommand);
    };
}
$clay = enclosePerson('Clay');
echo $clay('get me sweet tea!'); //"Clay get me sweet tea!"

闭包:在创建时封装周围状态的函数,即便闭包所在的环境不在了,闭包中封装的状态依然存在。在这个例子中,具名函数enclosePerson() 有个名为$name的参数,这个函数返回一个闭包对象,而且这个闭包对象封装了 $name参数,即便返回的闭包对象跳出了 enclosePerson() 函数的作用域,它也会记住$name参数的值,因为$name变量仍在闭包中。


在PHP中,将闭包和匿名函数视作相同的概念。但理论上说他们并不相同。所以,我将使用use关键字或者bindTo()方法附加状态的匿名函数称作闭包。将其与单纯的匿名函数区分开来

附:这是我在网上看到的一篇对闭包概念解释的比较清晰的文章:https://www.cnblogs.com/cxying93/p/6103375.html

书山有路勤为径 学海无涯苦作舟