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 句で変数を参照で宣言する必要がなくなり、
コードがよりクリーンで間違いにくくなります。