7

次の無名再帰関数があります。

$f = function($n) use (&$f) {
    return ($n == 1) ? 1 : $n * $f($n - 1);
};

echo $f(5); // 120

バージョン 7.4 に書き直そうとしましたが、エラーが発生しました。不足しているものを教えてください。

$f = fn($n) => ($n == 1) ? 1 : $n * $f($n - 1);
echo $f(5);

注意: 未定義変数: f

致命的なエラー: キャッチされていないエラー: 関数名は文字列でなければなりません

4

4 に答える 4

14

バーマーが言ったように、暗黙のバインディングがいつ行われるかはまだ未定義$fであるため、スコープ外から使用することはできません。$f

後でパラメーターとして渡すことを妨げるものは何もありません。

$f = fn($f, $n) => $n == 1 ? 1 : $n * $f($f, $n - 1);
echo $f($f, 5); // 120

アロー関数が機能する方法は、定義時に外側のスコープの変数の値によるバインドを使用することです。

既に述べたように、アロー関数は値による変数バインディングを使用します。これは、矢印関数内で使用されるuse($x)すべての変数に対して実行することとほぼ同じです。$x- https://wiki.php.net/rfc/arrow_functions_v2

変数へのクロージャーの割り当ては、$fクロージャーの定義の後に発生し、変数$fはその前に未定義です。

私の知る限り、アロー関数を定義する際に参照によってバインドするメカニズムはありません。

于 2019-11-15T19:00:37.360 に答える