Anonyme Callback-Funktionen in PHP

Während ich einige neue Funktionen von PHP 5.3 schon ausgiebig getest habe (vor allem die für mich weniger glücklich realisierten Namespaces) ist ein neues Feature gänzlich an mir vorbeigegangen: Anonyme Funktionen. Schon lange empfand ich dies stets als schlimmsten Mangel an PHP und nun, wo dieser endlich behoben scheint, habe ich es nicht mitbekommen. Keine Ahnung warum, aber scheinbar haben die Seiten, die über 5.3 berichtet haben, diese Funktion nicht sonderlich betont. Als alter J-Query-Freund ist das Arbeiten mit Callbacks für mich eine der elegantesten Methoden zur Entkopplung von Komponenten.

Bisher: create_function

Die einzige Lösung bisher bot create_function. Das Beispiel der offiziellen PHP-Dokumentation zeigt den wesentlichen Nachteil:

$newfunc = create_function('$a,$b',
    'return "ln($a) + ln($b) = ".log($a * $b);');

Der gesamte Funktionskörper musste in einen String gepackt werden. Zur Not ist das mal machbar, sieht aber natürlich fürchterlich aus und programmiert sich schlecht. So fehlt zum Beispiel das Syntaxhighlighting, was ja nun doch sehr wichtig ist.

Bisher: Nichtanonyme anonyme Funktionen

Auch nicht schön, aber aufgrund der Unbrauchbarkeit von create_function weiter verbreitet: Man definiert eine normale Funktion mit einem möglichst konfliktfreien, komplizierten Namen und übergibt den Funktionsnamen als Parameter. Dies wird Beispielsweise auch in WordPress genutzt, wenn man Filtern sagt, was sie in bestimmten Situationen zu tun haben.

Heute: Anonyme Funktionen

Schluss, aus, weg mit den Workarounds: PHP unterstützt endlich anonyme Funktionen. Callbacks und ähnliche Sachen lassen sich nun einfach und elegant umsetzen. Die beiden Beispiele der offiziellen Dokumentation der Funktionalität zeigen wie es geht:

echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');

Oder in eine Funktion in einer Variable speichern:

$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');

Vielen dank an das PHP-Team, jetzt habe ich wieder einen Grund mich auf ein neues PHP-Projekt zu freuen.