Closure 类

满耀
2023-12-01

简介

Closure 类是用于代表匿名函数的类。

匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象。

Closure 类过去常常用于实现细节,现在可以依赖它做更多的事情。自 PHP 5.4 起,Closure 类带有一些方法,允许对创建后的匿名函数进行更多的控制。

Closure 类被 final 关键字所修饰,故不能被继承。

Closure 类和匿名函数的关系

Closure 类是用于代表匿名函数的类,以便更好的使用匿名函数。

匿名函数,也被称作闭包(closure),指的是没有函数名称的函数。

匿名函数经常被用作回调函数参数,但它还有其他的用途。

匿名函数使用 Closure 类来实现。

匿名函数可以直接作为变量的值,PHP会自动把这种表达式转换为Closure 类的对象实例。

Closure 类的成员

构造方法

private function __construct() { }

Closure 类的构造方法(也叫构造函数)是私有的,目的是禁止在类外部实例化Closure 类。

__invoke() 方法

public function __invoke(...$_) { }

__invoke() 魔术方法的作用是,当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

Closure 类中包含__invoke() 方法,主要是为了与其他实现了 __invoke()魔术方法 的对象保持一致性,但调用匿名函数的过程与它无关。

bindTo() 方法

function bindTo($newthis, $newscope = 'static') { }

功能:复制当前匿名函数,将其绑定到指定的对象和类作用域。

  • $newthis 参数,指的是要将匿名函数绑定到哪个对象,它决定了匿名函数体中的 $this 的取值。
  • $newscope 参数,指的是要将匿名函数关联到哪个类作用域,它决定了匿名函数可以访问哪个类的私有和受保护的成员。'static'表示保持当前状态。
  • 静态闭包不能有绑定的对象( $newthis 参数的值应该设为 NULL ),不过仍然可以用 bindTo 方法来改变它们的类作用域。
<?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

bind() 方法

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();

call() 方法

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

fromCallable() 方法

public static function fromCallable (callable $callable) {}

从PHP7.1 版本,Closure 类新增了 fromCallable() 方法。

功能:将可调用的函数 $callable 转换为匿名函数(闭包),返回转换后的闭包。

 类似资料: