Anonymní funkce v PHP

Publikováno PHP

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

Komentáře