PHP中的Closure闭包

一、Closure是什么

PHP中的Closure,即匿名函数(Anonymous functions),也叫闭包。允许临时创建一个没有指定名称的函数。最经常用作回调函数参数的值。

比如下面的例子:

<?php
$f = function() {
    return "Hello, Closure!\n";
};

function testClosure(Closure $callback)
{
    return $callback();
}

print_r(testClosure($f));

其中$f是一个匿名函数的变量,当把它作为参数传给testClosure()时会自动转换成内置类Closure的对象实例。

匿名函数(闭包)可以使用use关键字传入上层作用域的变量:

<?php

$datetime = date("Y-m-d H:i:s",time());

$f = function() use ($datetime) {
    return "[$datetime] Hello, Closure!\n";
};

function testClosure(Closure $callback)
{
    return $callback();
}

print_r(testClosure($f));

二、Closure内置类

Closure类定义如下:

final class Closure {

    /**
     * 复制当前闭包对象,绑定指定的$this对象和类作用域。
     */
    function bindTo($newthis, $newscope = 'static') { }

    /**
     * Closure::bindTo的静态版本
     */
    static function bind(Closure $closure, $newthis, $newscope = 'static') { }

    /**
     * 绑定闭包对象到$newthis,并使用参数$parameters进行调用
     */
    function call ($newThis, ...$parameters) {}
    
    /**
     * 将一个callable对象转换成一个闭包对象
     */
    public static function fromCallable (callable $callable) {}
}

其中call()fromCallable()是从PHP 7.0以后新增的。

三、绑定

Closure类的bindTo()bind()方法提供了将一个闭包绑定到一个类对象的功能

<?php

class A {
    private $value = 111;
}

class B {
    private $value = 222;
}


$f = function() {
    return $this->value;
};

$objectA = new A();
$functionA = $f->bindTo($objectA, $objectA);
print_r($functionA());

$objectB = new B();
$functionB = $f->bindTo($objectB, $objectB);
print_r($functionB());

上面的例子将一个匿名函数$f绑定到类的实例,这样就可以在匿名函数中访问对象的成员变量了。

$objectA = new A();
$functionA = Closure::bind($f, $objectA, $objectA);
print_r($functionA());

$objectB = new B();
$functionB = Closure::bind($f, $objectB, $objectB);
print_r($functionB());

对于静态的bind功能一样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值