Closure 类

逃离我推掉我的手 2022-05-27 03:27 276阅读 0赞

简介

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

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

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

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

Closure 类和匿名函数的关系

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

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

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

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

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

Closure 类的成员

构造方法

  1. private function __construct() { }

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

__invoke() 方法

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

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

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

bindTo() 方法

  1. 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. 1

bind() 方法

  1. static function bind(Closure $closure, $newthis, $newscope = 'static') { }

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

bind() 方法是 bindTo() 方法的静态版本,功能一样。

  1. <?php
  2. class A {private $x = 1;}
  3. $getXCB = function() {return $this->x;};
  4. $getX = Closure::bind($getXCB, new A, 'A');
  5. echo $getX();

call() 方法

  1. function call ($newThis, ...$parameters) {}

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

功能:暂时将匿名函数绑定到指定的对象,并使用给定的参数调用它。

参数说明:$newThis 表示要将匿名函数绑定到哪个对象,后面的参数和匿名函数的参数相关。

  1. <?php
  2. class A {private $x = 1;}
  3. $getX = function() {return $this->x;};
  4. echo $getX->call(new A);

上述示例的输出为:

  1. 1

fromCallable() 方法

  1. public static function fromCallable (callable $callable) {}

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

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

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读

    相关 闭包(Closures

    闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。

    相关 Closure

    简介 Closure 类是用于代表匿名函数的类。 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象。 Closure 类过去常常用于实现细节,现在可以依赖

    相关 lua table vs closure

      最近在重构自己写的框架中的定时器模块,需要把回调函数保存起来,大概如下: function timer_mgr:save_timer( this,callback