In acest articol vom discuta despre o facilitate aparuta in PHP odata cu versiunea 5.3. Este vorba despre functiile anonime. Deci, ce sunt ele si la ce le putem folosi?
Functiile anonime sunt acele functii care nu poarta niciun nume (de unde si denumirea de anonime) si care pot fi apelate direct din interiorul unei alte functii. Cei dintre voi care sunt familiari cu JavaScript si jQuery vor gasi mai usor de inteles acest concept.
Sa vedem un scurt execmplu de functie anonima din jQuery pe care multi dintre voi il veti recunoaste:
<script type="text/javascript"> $(document).ready(function() { // Do something in here }); </script>
Dupa cum puteti vedea, functia ready()
a luat ca parametru o alta functie, de aceasta data fara a avea un nume specific. De ce? Pentru ca nu are nevoie. Functia nu va fi refolosita si nu va fi apelata nicaieri in alta parte decat aici.
La fel functioneaza functiile anonime si in PHP. Asa cum spune si documentatia oficiala, aceste functii devin utile mai ales in cazul functiilor native care asteapta un callback
. Sa luam de exemplu functia array_filter()
a carui descriere pe site-ul php.net este urmatoarea:
array_filter ( array $input [, callback $callback ] )
Pentru a fi mai clar sa vedem un exemplu concret.
<?php $v = array(0, 1, 2, 3, 4, 5, 6, 7, 8); function odd($var) { return($var & 1); } $odds = array_filter($v, "odd"); echo"<pre>"; print_r($odds); exit; ?>
Dupa cum se poate vedea array_filter()
ia ca parametru un array (in cazul nostru $v
) si o functie de callback
(la noi este vorba de odd()
). Rezultatul acestui cod va fi:
Array ( [1] => 1 [3] => 3 [5] => 5 [7] => 7 )
Problema cu acest gen de cod, este ca am definit o functie noua, care va fi apelata o singura data, dupa care va deveni inutila. Nu ar fi frumos daca am putea sa folosim o sintaxa ca cea de mai sus, din jQuery, ca sa definim in mod direct o functie care sa faca ce avem nevoie? Pai, putem.
De data aceasta sa extragem numerele pare din vector. Codul va arata asa:
<?php $v = array(0, 1, 2, 3, 4, 5, 6, 7, 8); $evens = array_filter($v, function($var) { return(!($var & 1)); }); echo"<pre>"; print_r($evens); exit; ?>
Iar rezultatul va fi urmatorul:
Array ( [0] => 0 [2] => 2 [4] => 4 [6] => 6 [8] => 8 )
Dupa cum vedeti, comportamentul este acelasi. Diferenta este ca nu a trebuit sa definesc o functie cu un nume specific pe care sa o apelez la callback
. A fost suficient sa trimit functia ca parametru secund catre array_filter()
.
Ideea este ca n-o sa va gasiti foarte des in situatia de a folosi acest tip de functii in PHP. Mai mult, sfatul meu este sa fiti foarte chibzuiti cu ele pentru ca daca dezvoltati aplicatii generale, nu puteti stii sigur daca acestea vor fi instalate pe servere cu PHP 5.3 sau mai jos.
Cu toate acestea, e bine ca astfel de functii exista, pentru ca arata progresul pe care PHP il face pentru a tine pasul cu limbaje de programare mai exotice. Pentru cei dintre voi care dezvolta plugin-uri de WordPress, iata un alt exemplu care arata unde pot folosite in mod inteligent functiile anonime.