PHP Conference Japan 2024

Closure 類別

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

簡介

用於表示匿名函式的類別。

匿名函式會產生此類型的物件。這個類別有一些方法,允許在建立匿名函式後進一步控制它。

除了這裡列出的方法之外,這個類別還有一個 __invoke 方法。這是為了與其他實現 呼叫魔術方法 的類別保持一致性,因為這個方法不用於呼叫函式。

類別概要

final class Closure {
/* 方法 */
private __construct()
公開 靜態 bind(Closure $closure, ?物件 $newThis, 物件|字串|null $newScope = "static"): ?Closure
公開 bindTo(?物件 $newThis, 物件|字串|null $newScope = "static"): ?Closure
公開 call(物件 $newThis, 混合 ...$args): 混合
公開 靜態 fromCallable(可呼叫 $callback): Closure
}

目錄

新增註釋

使用者貢獻的註釋 4 則註釋

chuck at bajax dot us
9 年前
這在我還在學習閉包是什麼以及如何使用它們時讓我有些困惑,但 PHP 中所稱的閉包與其他語言(例如 JavaScript)中所稱的閉包並不相同。

在 JavaScript 中,閉包可以被認為是一個作用域,當您定義一個函式時,它會默默地繼承它被定義的作用域,這稱為它的閉包,並且無論它在哪裡使用都會保留它。多個函式可以共享同一個閉包,並且只要它們在其可訪問的作用域內,它們就可以訪問多個閉包。

在 PHP 中,閉包是一個可呼叫的類別,您已手動將參數綁定到該類別。

這是一個細微的區別,但我覺得值得一提。
joe dot scylla at gmail dot com
8 年前
小技巧:您可以透過參考在自身內部使用閉包。

刪除目錄及其所有子目錄和檔案的範例

<?php
$deleteDirectory
= null;
$deleteDirectory = function($path) use (&$deleteDirectory) {
$resource = opendir($path);
while ((
$item = readdir($resource)) !== false) {
if (
$item !== "." && $item !== "..") {
if (
is_dir($path . "/" . $item)) {
$deleteDirectory($path . "/" . $item);
} else {
unlink($path . "/" . $item);
}
}
}
closedir($resource);
rmdir($path);
};
$deleteDirectory("path/to/directoy");
?>
luk4z_7 at hotmail dot com
9 年前
作用域
閉包會封裝其作用域,這表示它無法存取定義或執行它的作用域。 然而,可以使用 `use` 關鍵字將變數從父作用域(定義閉包的位置)繼承到閉包中。

function createGreeter($who) {
return function() use ($who) {
echo "Hello $who";
};
}

$greeter = createGreeter("World");
$greeter(); // Hello World

這會以值的方式繼承變數,也就是在閉包內部使用其原始名稱建立副本。
來源:Zend 認證學習指南。
info at ensostudio dot ru
2 年前
比較閉包
<?php
(string) new ReflectionFunction($fn) === (string) new ReflectionFunction($fn2)
?>
To Top