Home » Articole » Articole » Calculatoare » Programare » PHP » Funcții anonime în PHP

Funcții anonime în PHP

postat în: PHP 0

Funcțiile anonime, cunoscute și sub numele de închideri
(closures)
, permit crearea de funcții care nu au un nume specificat. Ele sunt cele mai utile ca valoare a parametrilor apelabili, dar au multe alte utilizări.

Funcțiile anonime sunt implementate folosind clasa Closure.

Exemplul #1 Exemplu de funcție anonimă

<?php
echo
preg_replace_callback('~-([a-z])~',
function ($match)
{
return strtoupper($match[1]);
}, 'hello-world');
// ieșire helloWorld
?>

Închiderile pot fi folosite și ca valori ale variabilelor; PHP convertește automat astfel de expresii în instanțe ale clasei interne Closure. Atribuirea unei închideri unei variabile folosește aceeași sintaxă ca orice altă atribuire, inclusiv punctul și virgulă final:

Exemplul #2 Exemplu de atribuire a variabilei funcției anonime

<?php
$greet = function($name)
{
printf("Hello
%s\r\n",
$name);
};

$greet('World');
$greet('PHP');
?>

Închiderile pot moșteni și variabile din domeniul părinte. Orice astfel de variabile trebuie transmise constructului de utilizare a limbajului. Începând cu PHP 7.1, aceste variabile nu trebuie să includă superglobale, $this sau variabile cu același nume ca parametru. O declarație de tip returnare a funcției trebuie plasată după clauza use.

Exemplul #3 Moștenirea variabilelor din domeniul părinte

<?php
$message =
'hello';

// Niciun "use"
$example
= function () {
var_dump($message);
};
$example();

// Moștenește $message
$example
= function () use ($message)
{
var_dump($message);
};
$example();

// Valoarea variabilei moștenite
provine din momentul în care funcția
// este definită, nu atunci când este apelată
$message
=
'world';
$example();

// Șterge mesaj
$message
=
'hello';

// Moștenește by-reference
$example
= function () use (&$message)
{
var_dump($message);
};
$example();

// Valoarea modificată în
domeniul părinte
// este reflectată în apelul funcției
$message
=
'world';
$example();

// Închiderile pot accepta și
argumente obișnuite
$example
= function ($arg)
use ($message)
{
var_dump($arg
.
' '
.
$message);
};
$example("hello");

// Declarația de tip returnare
vine după clauza de utilizare
$example
= function () use ($message):
string
{
return "hello
$message";
};
var_dump($example());
?>

Exemplul de mai sus va obține ceva similar cu:
Observație: Variabilă nedefinită: mesaj în /example.php pe linia 6
NULL
string(5) "hello"
string(5) "hello"
string(5) "hello"
string(5) "world"
string(11) "hello world"
string(11) "hello world"

Începând cu PHP 8.0.0, lista de variabile moștenite de domeniul de aplicare poate include o virgulă finală, care va fi ignorată.

Moștenirea variabilelor din domeniul părinte nu este același lucru cu utilizarea variabilelor globale. Variabilele globale există în domeniul global, care este același, indiferent de funcția care se execută. Sfera părinte a unei închideri este funcția în care a fost declarată închiderea (nu neapărat funcția de la care a fost apelată). Vezi următorul exemplu:

Exemplul #4 Închideri și domeniu

<?php
// Un coș de cumpărături de bază
care conține o listă de produse adăugate
// și cantitatea fiecărui produs. Include o metodă care
// calculează prețul total al articolelor din coș folosind o
// închidere ca apel invers (callback).
class
Cart
{
const PRICE_BUTTER
=
1.00;
const PRICE_MILK
=
3.00;
const PRICE_EGGS
=
6.95;

protected $products
= array();

public function add($product,
$quantity)
{
$this->products[$product] = $quantity;
}

public function getQuantity($product)
{
return isset($this->products[$product])
? $this->products[$product] :
FALSE;
}

public function getTotal($tax)
{
$total
=
0.00;

$callback
=
function ($quantity,
$product)
use ($tax,
&$total)
{
$pricePerItem
=
constant(__CLASS__
.
"::PRICE_"
.
strtoupper($product));
$total
+= ($pricePerItem
*
$quantity)
* ($tax
+
1.0);
};

array_walk($this->products,
$callback);
return round($total,
2);
}
}

$my_cart
= new
Cart;

// Adăugați câteva articole în
coș
$my_cart->add('butter',
1);
$my_cart->add('milk',
3);
$my_cart->add('eggs',
6);

// Imprimă totalul cu un impozit
pe vânzări de 5%.
print
$my_cart->getTotal(0.05)
. "\n";
// Rezultatul este 54.29
?>

Exemplul #5 Legarea automată a lui $this

<?php

class
Test
{
public function testing()
{
return function() {
var_dump($this);
};
}
}

$object
= new
Test;
$function
=
$object->testing();
$function();

?>

Exemplul de mai sus va obține:
object(Test)#1 (0) {
}

Când este declarată în contextul unei clase, clasa curentă este legată automat de aceasta, făcând $this disponibil în domeniul de aplicare al funcției. Dacă această legare automată a clasei curente nu este dorită, atunci pot fi folosite funcții anonime statice.

Sursa: PHP Manual, licența CC BY 3.0. Traducere și adaptare: Nicolae Sfetcu

Ghid WordPress pentru dezvoltatori
Ghid WordPress pentru dezvoltatori

Resursa esențială care te va ghida pas cu pas în lumea complexă a platformei WordPress.

Nu a fost votat 18.29 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Ghid WordPress pentru începători
Ghid WordPress pentru începători

Descoperă arta gestionării site-urilor web cu WordPress!

Nu a fost votat 13.70 lei25.11 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Proiectarea, dezvoltarea şi întreţinerea siturilor web
Proiectarea, dezvoltarea şi întreţinerea siturilor web

Ghidul complet pentru proiectarea, dezvoltarea și întreținerea siturilor web, o resursă indispensabilă

Nu a fost votat 13.70 lei54.86 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *