Funcțiile anonime, cunoscute și sub numele de închideri
, 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.
(closures)
Funcțiile anonime sunt implementate folosind clasa Closure.
<?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:
<?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
.
<?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());
?>
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:
<?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
?>
$this
<?php
class
Test
{
public function testing()
{
return function() {
var_dump($this);
};
}
}
$object
= new
Test;
$function
=
$object->testing();
$function();
?>
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
Lasă un răspuns