Closure::getCurrent în PHP

Returnează închiderea (funcția anonimă) care rulează acum, ca o funcție anonimă să se poată apela recursiv.

Sintaxă
Closure::getCurrent(): Closure

Ce face Closure::getCurrent

O funcție anonimă nu are nume, deci nu se poate apela pe ea însăși direct. Înainte de PHP 8.5, soluția era use (&$f): funcția prindea prin referință variabila în care era pusă.

Closure::getCurrent(), apelată în interiorul unei funcții anonime, returnează chiar acea funcție. Așa scrii recursivitate fără referințe și fără să depinzi de numele variabilei.

Apelată în afara unei închideri, metoda aruncă Error.

Ce returnează

Obiectul Closure care se execută în acel moment.

Exemple

Exemplul 1: Factorial recursiv cu o funcție anonimă

<?php
$factorial = function (int $n): int {
    return $n <= 1 ? 1 : $n * Closure::getCurrent()($n - 1);
};

echo $factorial(5);

Rezultat

120

Exemplul 2: Parcurgerea unui meniu pe mai multe niveluri

<?php
$meniu = [
    "Acasă" => [],
    "Învață" => ["PHP" => ["Tablouri" => []], "SQL" => []],
];

$afiseaza = function (array $elemente, int $nivel = 0): void {
    foreach ($elemente as $nume => $copii) {
        echo str_repeat("  ", $nivel) . "- $nume\n";
        Closure::getCurrent()($copii, $nivel + 1);
    }
};

$afiseaza($meniu);

Rezultat

- Acasă
- Învață
  - PHP
    - Tablouri
  - SQL

Greșeli frecvente

  • Apelezi Closure::getCurrent() într-o funcție cu nume sau la nivelul fișierului și primești Error.
  • Într-o funcție anonimă definită în altă funcție anonimă, getCurrent() returnează funcția interioară (cea care rulează), nu pe cea exterioară.

Comenzi înrudite

  • function () use / fn: O funcție fără nume, salvată într-o variabilă sau dată direct altei funcții. Poate folosi variabile din exterior cu use.
  • function: Definește o funcție proprie: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.
  • call_user_func / call_user_func_array: Apelează o funcție dată printr-o variabilă (nume, closure sau metodă), cu argumentele primite.
  • Operatorul pipe |>: Trimite valoarea din stânga ca argument funcției din dreapta, ca să scrii transformări în lanț de la stânga la dreapta.