Closure 类是用于代表匿名函数的类。
匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象。
Closure 类过去常常用于实现细节,现在可以依赖它做更多的事情。自 PHP 5.4 起,Closure 类带有一些方法,允许对创建后的匿名函数进行更多的控制。
Closure 类被 final 关键字所修饰,故不能被继承。
Closure 类是用于代表匿名函数的类,以便更好的使用匿名函数。
匿名函数,也被称作闭包(closure),指的是没有函数名称的函数。
匿名函数经常被用作回调函数参数,但它还有其他的用途。
匿名函数使用 Closure 类来实现。
匿名函数可以直接作为变量的值,PHP会自动把这种表达式转换为Closure 类的对象实例。
private function __construct() { }
Closure 类的构造方法(也叫构造函数)是私有的,目的是禁止在类外部实例化Closure 类。
public function __invoke(...$_) { }
__invoke() 魔术方法的作用是,当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
Closure 类中包含__invoke() 方法,主要是为了与其他实现了 __invoke()魔术方法 的对象保持一致性,但调用匿名函数的过程与它无关。
function bindTo($newthis, $newscope = 'static') { }
功能:复制当前匿名函数,将其绑定到指定的对象和类作用域。
<?php
class A {private $x = 1;}
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A');
//$getX = $getXCB->bindTo(new A, new A); // 和上面传递类名参数的写法实现的效果一样
echo $getX();
上述示例的输出为:
1
static function bind(Closure $closure, $newthis, $newscope = 'static') { }
功能:复制匿名函数$closure,将其绑定到指定的对象和类作用域。
bind() 方法是 bindTo() 方法的静态版本,功能一样。
<?php
class A {private $x = 1;}
$getXCB = function() {return $this->x;};
$getX = Closure::bind($getXCB, new A, 'A');
echo $getX();
function call ($newThis, ...$parameters) {}
从PHP7.0 版本,Closure 类新增了 call() 方法。
功能:暂时将匿名函数绑定到指定的对象,并使用给定的参数调用它。
参数说明:$newThis 表示要将匿名函数绑定到哪个对象,后面的参数和匿名函数的参数相关。
<?php
class A {private $x = 1;}
$getX = function() {return $this->x;};
echo $getX->call(new A);
上述示例的输出为:
1
public static function fromCallable (callable $callable) {}
从PHP7.1 版本,Closure 类新增了 fromCallable() 方法。
功能:将可调用的函数 $callable 转换为匿名函数(闭包),返回转换后的闭包。