闭包是一个在创建时封装周围状态的函数。 虽然闭包所在的环境不再存在,但是闭包中封装的状态仍然存在。
匿名函数是没有名称的函数。 匿名函数可以作为形式参数传递给变量,并且可以像任何其他 PHP 对象一样传递。 但是,匿名函数仍然是函数,因此可以调用它们并且可以传入参数。匿名函数非常适合作为函数或技术的后备。
注意:理论上,闭包和匿名函数是不同的概念。 然而php的闭包,PHP 将它们视为同一概念。 因此php的闭包,当我们谈论闭包时,我们也指的是匿名函数,反之亦然。
PHP 闭包和匿名函数使用与普通函数相同的复杂语句,但闭包和匿名函数显然是伪装成函数的对象(Closure 类的实例)。
//创建闭包
$闭包=函数($名称){
returnsprintf("Hello%s",$name);
回声 $closure("杰瑞");
//检查$closure变量是否是一个闭包
var_dump($closureinstanceofClosure);
上面的代码创建了一个闭包对象,然后将其形式参数传递给 $closure 变量。 闭包与普通 PHP 函数非常相似。 它们使用相同的复杂语句、接收参数并且可以返回值。
说明:我们之所以仍然可以调用 $closure 变量,是因为这个变量的值是一个闭包,但是闭包对象实现了 __invoke() 魔术。 只要变量名后面有(),PHP就会找到并调用__invoke()方法。
使用闭包 我们通常使用 PHP 闭包作为函数和技术的反弹。 许多 PHP 函数都使用反弹函数,例如 array_map() 和 preg_replace_callback()。 在下面的示例中,我们将使用 array_map() 来处理链表并将链表中的每个项目加 1:
$numbers=array_map(函数($number){
返回$数字++;
},[1,2,3]);
var_dump($数字);
附加状态 PHP 闭包不会像真正的 javascrypt 闭包那样手动封装应用程序状态。 我们必须自动调用闭包对象的bindTo()方法或使用use关键字将状态附加到PHP闭包。
使用 use 关键字
使用 use 关键字附加闭包状态变得越来越普遍,所以让我们首先看看这些方法。 当使用 use 关键字将变量附加到闭包时,附加变量将记住附加时分配给它的值。
函数汽车($名称){
返回函数($statu)使用($name){
returnsprintf("汽车%sis%s",$name,$statu);
//将汽车名称封装在闭包中
$car=汽车(“宝马”);
//调用小车的动作
//输出-->“bmwisrunning”
回声$汽车(“运行”);
注意:使用 use 关键字将多个参数传递到闭包中。 在这种情况下,就像 PHP 函数或技术的参数一样,使用冒号分隔多个参数。
使用bindTo()方法附加闭包的状态
与其他 PHP 对象类似,每个闭包实例都可以使用 $this 关键字来获取闭包的内部状态。 闭包对象的默认状态是无用的,但是有一个 __invoke() 魔术和 bindTo() 方法。
bindTo() 方法为闭包带来了一些有趣的潜力。 我们可以使用这个方法将 Closure 对象的内部状态绑定到其他对象。
bindTo()方法的第二个参数非常重要。 它的作用是指定绑定闭包的对象所属的PHP类。 为此,闭包可以访问闭包所绑定的对象中的受保护和私有成员变量。
类测试闭包
私有$名称=[];
私人$年龄;
私人$性;
公共函数 addPerson($name, $personCallback){
// 将闭包对象绑定到当前实例
$this->name[$name]=$personCallback->bindTo($this,__CLASS__);
公共函数显示($名称){
foreach($this->nameas $key=>$callback){
如果($键==$名称){
// 执行闭包对象并将闭包状态附加到类
$callback();
回显“名称:{$名称}n”;
echo "年龄:{$this->年龄}n";
echo "性别:{$this->性别}n";
$person=newTestClosure();
$person->addPerson("杰瑞", function(){
$这个->年龄=19;
$this->性别=“男人”;
});
$person->display("杰瑞");
/**输出
姓名:杰瑞
年龄:19
性别:男
*/