function () use / fn în PHP

Funcții și apeluri PHP 5.3+ (fn: PHP 7.4+, sintaxa functie(...): PHP 8.1+)

O funcție fără nume, salvată într-o variabilă sau dată direct altei funcții. Poate folosi variabile din exterior cu use.

Sintaxă
$f = function ($x) use ($y) { return $x + $y; };
$g = fn($x) => $x + $y;

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ție function () { ... } și primești Undefined variable. Funcția săgeată fn nu 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ște function () 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.