{"id":428,"date":"2011-08-11T00:23:47","date_gmt":"2011-08-10T22:23:47","guid":{"rendered":"https:\/\/sgaul.de\/?p=428"},"modified":"2014-03-13T21:34:55","modified_gmt":"2014-03-13T20:34:55","slug":"anonyme-callback-funktionen-in-php","status":"publish","type":"post","link":"https:\/\/sgaul.de\/2011\/08\/11\/anonyme-callback-funktionen-in-php\/","title":{"rendered":"Anonyme Callback-Funktionen in PHP"},"content":{"rendered":"

W\u00e4hrend ich einige neue Funktionen von PHP 5.3 schon ausgiebig getest habe (vor allem die f\u00fcr mich weniger gl\u00fccklich realisierten Namespaces<\/a>) ist ein neues Feature g\u00e4nzlich 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 \u00fcber 5.3 berichtet haben, diese Funktion nicht sonderlich betont. Als alter J-Query-Freund ist das Arbeiten mit Callbacks f\u00fcr mich eine der elegantesten Methoden zur Entkopplung von Komponenten.<\/p>\n

Bisher: create_function<\/h2>\n

Die einzige L\u00f6sung bisher bot create_function. Das Beispiel der offiziellen PHP-Dokumentation<\/a> zeigt den wesentlichen Nachteil:<\/p>\n

$newfunc = create_function('$a,$b',\r\n    'return \"ln($a) + ln($b) = \".log($a * $b);');<\/pre>\n

Der gesamte Funktionsk\u00f6rper musste in einen String gepackt werden. Zur Not ist das mal machbar, sieht aber nat\u00fcrlich f\u00fcrchterlich aus und programmiert sich schlecht. So fehlt zum Beispiel das Syntaxhighlighting, was ja nun doch sehr wichtig ist.<\/p>\n

Bisher: Nichtanonyme anonyme Funktionen<\/h2>\n

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

Heute: Anonyme Funktionen<\/h2>\n

Schluss, aus, weg mit den Workarounds: PHP unterst\u00fctzt endlich anonyme Funktionen. Callbacks und \u00e4hnliche Sachen lassen sich nun einfach und elegant umsetzen. Die beiden Beispiele der offiziellen Dokumentation der Funktionalit\u00e4t<\/a> zeigen wie es geht:<\/p>\n

echo preg_replace_callback('~-([a-z])~', function ($match) {\r\n    return strtoupper($match[1]);\r\n}, 'hello-world');<\/pre>\n

Oder in eine Funktion in einer Variable speichern:<\/p>\n

$greet = function($name)\r\n{\r\n    printf(\"Hello %s\\r\\n\", $name);\r\n};\r\n\r\n$greet('World');\r\n$greet('PHP');<\/pre>\n

Vielen dank an das PHP-Team, jetzt habe ich wieder einen Grund mich auf ein neues PHP-Projekt zu freuen.<\/p>\n","protected":false},"excerpt":{"rendered":"

W\u00e4hrend ich einige neue Funktionen von PHP 5.3 schon ausgiebig getest habe (vor allem die f\u00fcr mich weniger gl\u00fccklich realisierten Namespaces<\/a>) ist ein neues Feature g\u00e4nzlich 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 \u00fcber 5.3 berichtet haben, diese Funktion nicht sonderlich betont. Als alter J-Query-Freund ist das Arbeiten mit Callbacks f\u00fcr mich eine der elegantesten Methoden zur Entkopplung von Komponenten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[91],"tags":[],"_links":{"self":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/428"}],"collection":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/comments?post=428"}],"version-history":[{"count":5,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/428\/revisions"}],"predecessor-version":[{"id":2536,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/428\/revisions\/2536"}],"wp:attachment":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/media?parent=428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/categories?post=428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/tags?post=428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}