一、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
功能一样。