Știi ceva despre închideri în PHP. PHP: Funcții anonime

Wikipedia spune că o funcție anonimă este o funcție care poate exista fără un identificator. Sună destul de interesant! În această lecție, vă voi arăta câteva exemple despre modul în care puteți crea și determina funcția cu metode non-standard.

Să începem imediat cu exemple:

Test de funcții ($ var) (Echo "Aceasta este $ var";)

Aceasta este o caracteristică foarte simplă. Acum, în plus față de apelul obișnuit, putem rula această caracteristică folosind o variabilă care stochează numele acestei funcții. Aproximativ ca acesta:

$ f \u003d "test"; $ F ("funcție variabilă");

Dacă porniți codul, veți vedea mesajul Aceasta este o funcție variabilă. A spune, de spus, prelucrarea citatelor unice este declanșată mai repede decât dublu.

Putem aplica această tehnică în OOP. Exemplu cu php.net:

Clasa foo (variabila function () ($ nume \u003d "bara"; $ acest -\u003e $ nume () (); // acest apel de bara () metoda) function bara () (ecou "aceasta este bara";)) $ foo \u003d noul foo (); $ Funcname \u003d "variabil"; $ foo -\u003e $ funnme (); // acest apel $ foo-\u003e variabil ()

Acest concept este destul de interesant. Acesta poate fi folosit pentru a implementa apelurile, tabelele de caracteristică și așa mai departe.

Acum voi încerca să vă explic ce caracteristici anonime sunt:

$ intrare \u003d matrice (1, 2, 3, 4, 5); $ Ieșire \u003d array_filter ($ intrare, funcție ($ v) (return $ v\u003e 2;));

funcție ($ V) (returnați $ v\u003e 2; aceasta este o funcție anonimă. De asemenea, putem să-l atribuim variabilei de utilizat în viitor.

$ max \u003d funcție ($ v) (return $ v\u003e 2;); $ intrare \u003d matrice (1, 2, 3, 4, 5); $ Ieșire \u003d array_filter ($ intrare, $ max);

Acum, să ne familiarizăm cu noul cuvânt cheie de utilizare. Vom scrie o altă caracteristică anonimă pentru acest lucru (lucrări cu PHP 5.3):

$ max_comp \u003d funcție ($ max) (funcția de return ($ v) utilizare ($ max) (return $ v\u003e $ max;);); $ intrare \u003d matrice (1, 2, 3, 4, 5); $ Ieșire \u003d array_filter ($ intrare, $ max_comp (2));

În acest exemplu, folosim un efect de închidere utilizând un cuvânt cheie de utilizare. Această tehnică permite caracteristica anonimă să acceseze variabilele externe. A fost briza de programare procedurală?

Iată un alt exemplu mai simplu:

$ string \u003d "salut lume!"; $ închidere \u003d funcție () Utilizați ($ string) (șir de $); $ închidere ();

După cum am spus, variabilele pe care vrem să le folosim (din domeniul global) în astfel de funcții trebuie transmise prin utilizare. Este important de observat că numai valoarea este transmisă în mod implicit, deci dacă doriți să modificați conținutul variabilei transmise și doriți să se modifice în afara unei funcții anonime, transferați valoarea la adresa:

$ x \u003d 1; $ închidere \u003d funcție () utilizați (+ $ x) (++ $ x;); Echo $ X. "
"$ închidere (); echo $ x."
"$ închidere (); echo $ x."
";

În acest exemplu, metoda noastră modifică conținutul variabilei $ X cu fiecare funcție anonimă a apelului. Dacă nu am trecut adresa variabilei și am avea variabila în sine trei.

Frumusețea adevărată a "închiderii" este că nu se răstoarnă spațiul de nume global. De îndată ce o funcție anonimă a efectuat acțiunea, toate variabilele utilizate în acesta sunt distruse automat.

Bună ziua tuturor și astăzi vom vorbi ce este funcțiile anonime în PHP Și unde să le folosească.

Funcții anonimesau altfel funcțiile lambda. - Acestea sunt funcții care nu au nume.

Un exemplu de funcție obișnuită

Funcție FUNAME ($ txt) (
Echo "Textul meu:" $ txt;
}

$ Func \u003d "FUNAME";
$ Func ("textul meu");
?>

Avem o caracteristică care ia un parametru. Apoi scriem numele funcției la variabilă și o numim. Nimic neobișnuit. ÎN Oop Acest stil va fi mai justificat.

Myclass de clasă (
Bara de funcții () ()
// Codul
}
}

$ clasa \u003d noua myclass ();
$ Func \u003d "bar";
$ Clasa -\u003e $ func ();
?>

Funcții anonime

Dacă sunteți familiarizați cu caracteristicile anonime din limbă JavaScript., atunci înțelegeți de ce sunt necesare și dacă nu, citiți mai departe.

Pentru a face funcția noastră anonimă undeva pe codul programului, îl putem aloca unei variabile

$ Func \u003d funcția () (
// Codul
};

$ func ();
?>

Rețineți că, la sfârșit, merită ; deoarece Atribimați o valoare variabilă egală cu funcția. Dar toată sarea nu este în acest sens, ci în faptul că putem folosi aceste funcții ca funcții de apel invers. De exemplu:

$ Val \u003d array_filter ($ intrare, funcție ($ v) (return $ v\u003e 2;));
?>

Utilizați cuvântul cheie

Din nou, dacă știți JavaScript.Aceasta nu va fi o problemă pentru dvs. Cuvânt cheie. Utilizare Vă permite să utilizați recepția închidere. Cu aceasta, putem ajunge la variabile externe.

$ Mx \u003d funcția ($ high_val) (
Funcția de returnare ($ val) Utilizați ($ high_val) (
Returnați $ val\u003e $ high_val;
};
};

$ i \u003d matrice (1, 2, 3, 4, 5, 6, 7);
$ O \u003d array_filter ($ intrare, $ max_comp (2));
?>

Aici suntem în interiorul nostru funcțiile lambda. Folosim o variabilă globală high_val.. Astfel încât a fost posibil, trebuie să trimitem după cuvânt funcţie. și parametrii din paranteze scriu utilizare Și treceți numele variabilei externe acolo, pe care dorim să le folosim în interiorul codului funcției.

Cu toate acestea, nu vom putea schimba importanța variabilei noastre globale în acest fel. Pentru a face acest lucru, trebuie să specificați un semn înaintea numelui său. &

$ nume \u003d "brian";
$ SetName \u003d funcția ($ n) Utilizați (& $ nume) (
$ nume \u003d $ n;
};

$ SetName ("David");
Echo $ nume;
?>

Concluzie

Așa că astăzi ați învățat ce este funcțiile anonime în PHP și cum să le folosim. Noroc!

Funcția poate fi atribuită unei variabile, precum și valoarea obișnuită. Pentru a face acest lucru, numele funcției trebuie să fie atribuit unei variabile sub forma unui șir, dar fără a specifica parantezele:

\\ n ";) $ my_func \u003d" foo "; // Acum putem rula funcția foo () utilizând variabila $ my_func, care stochează numele funcției specificate ca un șir $ my_func (); // apelați la foo () funcția?\u003e

Un astfel de concept PHP are numele "variabilele funcției". Se află în faptul că, dacă adăugați la variabila la sfârșitul parantezelor rotunde, atunci interpretierul PHP va verifica mai întâi, nu există nici o funcție cu numele egalității sens variabilă și dacă există o astfel de funcție - o va executa.

Deci, după cum se arată în exemplul de mai sus, puteți face numai cu funcțiile anumitor utilizatori. Structuri și funcții lingvistice încorporate, cum ar fi Echo, Unset (), Isset () și alte lucruri similare nu pot fi atribuite direct variabilelor în același mod. Dar puteți face funcția de ambalaj (înveliș) astfel încât structurile lingvistice încorporate să poată funcționa ca funcții de utilizator.

Funcții anonime

Funcție anonimă - O funcție care nu are propriul nume, uneori puteți întâlni un alt nume de astfel de funcții - funcția lambda. Caracteristicile anonime pot fi transmise altor funcții ca argumente sau alocați o variabilă ca valori convenționale:

Notă Exemplul, la sfârșitul definiției funcției există un punct șiicolon, deoarece o funcție anonimă este în mod inerent, și atribuim valoarea variabilei, apoi la sfârșit, ca și pentru instrucțiunile obișnuite, punctul este placat.

Funcțiile anonime diferă de la numit de faptul că acestea sunt create numai în momentul în care executarea se va folosi, astfel încât să le puteți folosi numai după definiția lor: