Php 简明教程

PHP – Closure::call()

在 PHP 中, closure 是一个匿名函数,可以访问其创建的范围内的变量,即使该范围已经关闭。你需要在其中指定 use 关键字。

闭包将函数代码与创建它们的范围封装在对象中。在 PHP 7 中,引入了一个新的 closure::call() 方法来将对象范围绑定到闭包并调用它。

Methods in the Closure Class

闭包类具有以下方法,包括 call() 方法 −

final class Closure {

   /* Methods */
   private __construct()
   public static bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure
   public bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure
   public call(object $newThis, mixed ...$args): mixed
   public static fromCallable(callable $callback): Closure

}

call() method 是闭包类的静态方法。它被引入为 bind() 或 bindTo() 方法的快捷方式。

bind() method 根据特定的 bound 对象和类范围复制闭包,而 bindTo() 方法则使用新的 bound 对象和类范围复制闭包。

call() 方法具有以下 signature

public Closure::call(object $newThis, mixed ...$args): mixed

call() 方法将闭包临时绑定到 newThis,并使用任何给定的参数调用它。

在 PHP 7 之前的版本中,bindTo() 方法可以使用如下方式:

<?php
   class A {
      private $x = 1;
   }

   // Define a closure Pre PHP 7 code
   $getValue = function() {
      return $this->x;
   };

   // Bind a clousure
   $value = $getValue->bindTo(new A, 'A');
   print($value());
?>

该程序将 $getValue (它是一个闭包对象)绑定到 A 类的对象,并打印其私有变量 $x 的值 - 它为 1。

在 PHP 7 中,绑定通过 call() 方法实现,如下所示 −

<?php
   class A {
      private $x = 1;
   }

   // PHP 7+ code, Define
   $value = function() {
      return $this->x;
   };

   print($value->call(new A));
?>