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