Closure::getCurrent

現在実行中のクロージャを返す

説明

public static Closure Closure::getCurrent()

現在実行中のクロージャを返します。このメソッドは主に、 use キーワードを使ってクロージャ変数への参照をキャプチャすることなく、 再帰的なクロージャを実装するのに役立ちます。

このメソッドはクロージャの内部から呼び出す必要があります。 クロージャのコンテキスト外から呼び出すと、 Error: Current function is not a closure. が発生します。

パラメータ

この関数にはパラメータはありません。

戻り値

現在実行中の Closure を返します。

エラー / 例外

クロージャのコンテキスト外から呼び出された場合、 Error をスローします。

例1 Closure::getCurrent の例

Closure::getCurrent を使って 再帰的なフィボナッチ関数を実装する例:

<?php
$fibonacci = function (int $n) {
    if ($n === 0 || $n === 1) {
        return $n;
    }

    $fn = Closure::getCurrent();
    return $fn($n - 1) + $fn($n - 2);
};

echo $fibonacci(10); // 出力: 55
?>

例2 従来のアプローチとの比較

PHP 8.5 より前のバージョンでは、再帰的なクロージャを実装するには use キーワードを使ってクロージャ変数への参照をキャプチャする必要がありました:

<?php
// 従来のアプローチ (PHP 8.5 でも引き続き使用可能)
$fibonacci = function (int $n) use (&$fibonacci) {
    if ($n === 0) return 0;
    if ($n === 1) return 1;
    return $fibonacci($n - 1) + $fibonacci($n - 2);
};

echo $fibonacci(10); // 出力: 55
?>

Closure::getCurrent を使うアプローチでは、 use 句で変数を参照で宣言する必要がなくなり、 コードがよりクリーンで間違いにくくなります。