POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.
V tomto článku se budu zabývat anonymními funkcemi v jazyce PHP. Programátoři v JavaScriptu se s takovými funkcemi už dozajista setkali, přesto ještě před tím než začnu, nejprve vysvětlím, co to anonymní funkce vlastně jsou.
Co jsou to anonymní funkce?
Anonymní nebo také lambda funkce, jsou takové funkce, které nemají název a jsou předávány formou parametru nebo proměnné.
Jakou verzi PHP potřebuju?
Teoreticky je bylo možné používat už od verze 4.0.1, ale ta syntaxe, kterou mnozí znají z JavaScriptu a je zcela jistě přehlednější, neboť se již nezapisuje jako string, přišla až s verzí 5.3.
Úplnou novinkou od verze 5.4 je přístup ve funkci k objektu $this (pokud je v objektu definována) a typehint callable.
Syntaxe
PHP >= 4.0.1
$soucin = create_function('$a, $b', 'return $a*$b;');
echo $soucin(3, 5); // 15
PHP >= 5.3
$soucin = function ($a, $b) {
return $a*$b;
};
echo $soucin(3, 5); // 15
Tato druhá možnost má tu výhodu, že se obsah funkce bude v editorech obarvovat, stejně jako celý kód, to u předchozí verze nešlo, jelikož se funkce psala pouze jako řetězec.
Globální proměnné
Na rozdíl od JavaScriptu nejsou přístupné proměnné definované mimo funkci, ale pokavaď je potřebujete, bude nejvhodnější použít klauzuli use místo globálních proměnných.
$c = 2;
$soucin = function ($a, $b) use ($c) {
return $a*$b*$c;
};
echo $soucin(3, 5); // 30
Novinky ve verzi PHP 5.4
Již dříve zmíněné novinky v nové verzi PHP ukážu podrobněji.
Použití objektu $this uvnitř funkce
class Trida {
function getLambda () {
return function () {
return $this->metoda();
};
}
function metoda () {
return 'Ahoj světe';
}
}
$ahoj = (new Trida)->getLambda();
echo $ahoj(); // Ahoj světe
Typehint callable
Jde defakto o zamezení vstupu takových parametrů, které nejsou callable [pozor, nemusí to být nutně funkce, ale také objekty s metodou __invoke(), array($object, ‚method‘) a array(‚Class‘, ‚method‘)].
$ahoj = function () {
return 'Ahoj světe';
};
function vypisAhoj (callable $lambda) {
echo $lambda();
}
vypisAhoj($ahoj); // Ahoj světe
Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)