Bár nem tegnap történt, hogy az 5.3-as sorozat első verziója kijött, gondoltam kicsit körbejárom a névtelen függvények témakörét az ősidőktől napjainking. Az ősidő alatt itt természetesen a 4-es verziót értem, amikor még csak a call_user_func állt a rendelkezésünkre. Lássuk, hogyan is ment ez.

A create_function módszer (attól tekintsünk el, hogy a __FUNCTION__ varázskonstans csak a 4.3-as verzióban jelent meg):

$f = create_function('', 'echo __FUNCTION__ . "\n";');
call_user_func($f);

A függvény neve stringként módszer:

$f = 'myFunction';
call_user_func($f);

Az osztály és a statikus metódus neve tömbként:

$f = array('MyClass', 'myStaticFunction');
call_user_func($f);

Az objektum és a metódus neve tömbként:

$c = new MyClass();
$f = array($c, 'myFunction');
call_user_func($f);

Az osztály és a statikus metódus neve stringként (5.2.3-as PHP-tól):

$f = 'MyClass::myStaticFunction';
call_user_func($f);

Az objektum meghívása (5.3.0-s PHP-tól):

$c = new MyClass();
call_user_func($c);

És ezzel el is érkeztünk a jelenhez. Az 5.3.0-s verzióval megjelentek a closure-ök (az újfajta névtelen függvények), amolyan JavaScript-es definiálással:

$f = function () {
};

Természetesen a teljes visszafelé kompatibilitásról ne is álmodjunk ezért kezdjük is el végignézni az előző módokat, hogy mi működik továbbra is:

A create_function módszer megy továbbra is (emlékeim szerint 5.3 előtt is működött így, ezért ez nem túl meglepő):

$f = create_function('', 'echo __FUNCTION__ . "\n";');
$f();

A függvény neve stringként módszer (működik):

$f = 'myFunction';
$f();

Itt sajnos meg is állhatunk. A tömbös rendszerek (PHP Fatal error: Function name must be a string) és az osztály+statikus metódus neve stringként (PHP Fatal error: Call to undefined function MyClass::myStaticFunction()) nem működik.

Maradt még az objektum direkt meghívása, ami működik, de ez sem túl nagy meglepetés, mivel az 5.3.0-s verzióbal vezették be hozzá az új varázsmetódust:

$c = new MyClass();
$c();

Ilyenkor (és a call_user_func-os esetben is) az osztály __invoke() metódusa hívódik meg.

Ezzel azt hiszem nagyjából ki is veséztük a különböző callback típusok és névtelen függvények hívhatóságát. Maradt még némi scope kérdés, de az házi feladat (annyit megsúgok, hogy a use a kulcsszó). Egy kis segítség hozzá:

+++++

Hozzászólások Hozzászólások RSS

  1. Ez a névtelen függvény szerintem csak egy korkövető újítás. Eddig még nekem sose volt rá szükségem. Ha rövidebb függvények ugyan kellettek is, azok rendre több helyzetben is előjöttek így célszerű volt kiszervezni őket globális szintre vagy statikus Utility osztályba.

    Javascriptnél az eseménykezelés miatt egyenesen szinte kell használni, mert 1-1 elemnek saját kezelő függvénye van, amit felesleges lenne külön deklarálni, ha máshol nincs rá szükség. Viszont PHP-nál nincs eseménykezelés, legalábbis felhasználói interakciószerűen. Akkor mire is jó? :)

    A másik, ami kicsit leakasztott ez az utolsó kód, az objektum meghívása. Azt értem, hogy ekkor az __invoke fut.. de erre megint nem jut eszembe semmi, hogy miért is jó ez? :) Talán azt tudnám elképzelni, hogy osztályváltozók beállítására lehetne használni, de ezt egyrészt már a konstruktorban szokás összehozni, másfelől ha valaki a kódot olvassa akkor egy set() függvény sokkal jobban adja magát, mint egy ilyen objektumhívás.

    Persze az dicséretes, hogy tényleg fejlődik a nyelv és ilyen trükkök is kerülnek bele, lehet, hogy csak én vagyok lemaradva és már régen használnom kellene ezeket. :)

Szólj hozzá!

regisztráció, bejelentkezés

Az oldalon nem jelenik meg.

Ezeket a tageket használhatod: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*