Névtelen függvények PHP-ben
Mióta túlnyomórészt ELisp és JavaScript nyelveken fejlesztek, egyre jobban hiányoznak a funkcionális programozásban megszokott lehetőségek. Így történt ma, hogy egy probléma megoldásának PHP alapú kivitelezése során szerettem volna névtelen függvényeket használni. Várakozásaimmal ellentétben rendelkezik a PHP is egyfajta tálalással, habár ez nem az a vonás, amire különösebben büszkék lehetnénk.A
Még márciusban terjesztett egy patch-et Wez Furlong a közösség elé, amely valódibb névtelen függvényekkel vértezi fel az értelmezőt, mellőzve aA megvalósítás erőssége azonban nem ebben jelentkezik. Wez implementációja automatikusan idézőjelezi a szükséges kifejezéseket, tehát nem kell külön a teljes függvénytörzset aposztrófok közé szorítani, egyszerűen úgy kódolhatunk, ahogy az természetes, és egyúttal a teljes kifejezést közvetlenül argumentumként is átadhatjuk.Így már klassz.
■
$sum = create_function('$a, $b', 'return $a + $b;');
echo $sum(4, 5); //9
create_function()
-nel többek között az a baj, hogy a névtelen függvény deklarációjának explicit kivédése megfoszt a fejlesztőkörnyezetünk valamennyi funkciójának használatától, de hogy ne szaladjunk túlságosan előre, egyszerűen a kódszínezés hiányában is nehezebben emészthető programot kapunk. Az implementáció másik hiányossága, hogy míg egy névvel definiált függvény esetén a függvény kódjában a __FUNCTION__
állandóval tudunk hivatkozni magára a függvényre, addig valamennyi névtelen függvénynél ez a __lambda_func
szövegliterárt adja vissza, így például rekurzív névtelen függvények csak explicit argumentum átadással lehetségesek. De vannak vele egyéb gondok is.Még márciusban terjesztett egy patch-et Wez Furlong a közösség elé, amely valódibb névtelen függvényekkel vértezi fel az értelmezőt, mellőzve a
create_function()
-ös – ahogy ő fogalmaz – paródiát. A Wez által bevezetett jelölés kisértetiesen hasonlít a JavaScriptes névtelen függvények deklarációjára:
$foo = function() {};
$data = array('állatkert', 'narancs', 'autó', 'citrom', 'alma');
usort($data, function($a, $b) {return strcmp($a, $b);});
var_dump($data); //Az adatok immáron ábécé rendben
Jó lenne
Csatlakozom.
BTW, csodálkozom, hogy ilyen rövidke patch-csel megoldható az ügy.
And the real WTF is...
Ördögi dolog ez...
"no way in PHP to access the parent scope"
ez fogalmazodott meg bennem is
Fontosabb fejlesztések
kicsit vilagosabb igy
A kozosseg termeszetesen nyitott, ellenben az ilyen marginalis valtoztatasokat nem feltetel nelkul veszik be, es van, hogy jopar felevnek kell eltelnie, mire megvitatjak egy-egy dolog alkalmazhatosagat, implementalasat, lasd anno a goto vita.
Nem üdvös