Ce face function () use / fn
O funcție anonimă (closure) se scrie ca o funcție obișnuită, dar fără nume, și se poate pune într-o variabilă. Se folosește mult cu array_map, array_filter, usort și pentru „callback-uri”.
O funcție anonimă nu vede automat variabilele din jur. Le aduci cu use ($variabila): valoarea este copiată în momentul creării. Cu use (&$variabila) lucrezi pe variabila originală.
Funcția săgeată fn($x) => expresie (PHP 7.4+) este o formă scurtă: are o singură expresie, returnată automat, și vede singură variabilele din exterior (prin valoare). Cuvântul static în față (static fn) împiedică legarea de $this. Cu strlen(...) (PHP 8.1+) obții o closure dintr-o funcție existentă.
Exemple
Exemplul 1: Funcție anonimă cu use
use copiază valoarea lui $tva în momentul creării funcției, așa că schimbarea ulterioară nu are efect.
<?php
$tva = 0.21;
$cuTva = function (float $pret) use ($tva): float {
return $pret * (1 + $tva);
};
$tva = 0.5;
echo $cuTva(100) . "\n";
print_r(array_map($cuTva, [10, 50]));
Rezultat
121
Array
(
[0] => 12.1
[1] => 60.5
)
Exemplul 2: Funcție săgeată, fără use
<?php
$minim = 100;
$produse = ["Mouse" => 80, "Monitor" => 900, "Căști" => 150];
$scumpe = array_filter($produse, fn($pret) => $pret >= $minim);
print_r($scumpe);
Rezultat
Array
(
[Monitor] => 900
[Căști] => 150
)
Exemplul 3: use prin referință și closure din funcție existentă
<?php
$total = 0;
$adauga = function (int $suma) use (&$total): void {
$total += $suma;
};
$adauga(30);
$adauga(12);
echo "Total: $total\n";
$lungime = strlen(...);
echo $lungime("dexblog");
Rezultat
Total: 42
7
Greșeli frecvente
- Uiți
useîntr-o funcțiefunction () { ... }și primeștiUndefined variable. Funcția săgeatăfnnu are această problemă. - Uiți
;după acolada de închidere când pui funcția într-o variabilă:$f = function () { ... };. Este o atribuire și trebuie terminată cu punct și virgulă. - Vrei mai multe instrucțiuni într-un
fn. Funcția săgeată acceptă o singură expresie; pentru mai mult cod foloseștefunction () use (...) { ... }.
Comenzi înrudite
function: Definește o funcție proprie: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.array_map: Aplică o funcție pe fiecare element al unui tablou și returnează tabloul cu rezultatele.array_filter: Păstrează doar elementele dintr-un tablou care îndeplinesc o condiție.call_user_func / call_user_func_array: Apelează o funcție dată printr-o variabilă (nume, closure sau metodă), cu argumentele primite.