PHP – Closure::call()



在PHP中,**閉包**是一個匿名函式,它可以訪問其建立作用域中的變數,即使該作用域已關閉。需要在其中指定 use 關鍵字。

閉包是封裝函式程式碼及其建立作用域的物件。在PHP 7中,引入了一個新的**Closure::call()**方法,用於將物件作用域繫結到閉包並呼叫它。

Closure 類中的方法

Closure 類包含以下方法,包括 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() 方法**是 Closure 類的靜態方法。它作為 bind() 或 bindTo() 方法的快捷方式被引入。

**bind() 方法**複製一個具有特定繫結物件和類作用域的閉包,而 bindTo() 方法則複製一個具有新繫結物件和類作用域的閉包。

call() 方法具有以下**簽名**:

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));
?>
廣告