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știError. - Î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.