PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Wer auf der Welt braucht temporäre Funktionen?

Neben einigen Kriegsverbrechen wie der Etablierung der Goto-Funktion und der damit bedingten Erfindung des Spaghetti-Codes bin ich jetzt über temporäre Funktionen in PHP gestolpert.

Nicht das das was neues wäre - nur wird mir immer mehr klar, was für ein riesen Unfug dieses Feature ist. Laut PHP Manual werden temporäre Funktionen im Lambda-Stil für die Lösung von Problemen eingesetzt, wenn die Rahmen-Parameter erst zur Laufzeit feststehen. Ich entwickle jetzt schon seit über 10 Jahren - untergekommen ist mir dieser Fall bislang noch nicht.

Wesentlich wahrscheinlicher ist der Einsatz von temporären Funktionen bei benutzerdefinierten Sortieraufgaben - z.B. in Verbindung mit array_walk… Hier besticht klar die schicke Kurznotation:

$arr= array("der ","ein ","dieser ","jener ");
array_walk(
  $arr,
  create_function(
    '&$v, $k',
    '$v = $v."Zug";'
  )
);

Was direkt ins Auge sticht: Es ist furchtbar unübersichtlich - wer seinen Code ein halbes Jahr später betrachtet hat erst nach 5 Minuten eine grobe Idee, was er damit wollte und weiß vielleicht nach einer halben Stunde Bescheid, was sein Code genau tut.

Stefan hat auf seinem Blog in einem Artikel zu create_function über ein Memoryleak berichtet, das temporäre Funktionen aufreisen. Ursache ist der Garbage-Collector, der mit dem von temporären Funktionen reservierten Speicherbereich nicht zurecht kommt.

Mein Fazit: Keine gute Idee. Man sollte immer schauen, das man seinen Code in ordentlich benannten und dokumentierten Funktionen abbildet. Besser schön objektorientiert mit einer Klasse.

Ähnliche Artikel:

  1. Hook- und Callback-Funktionen (Teil 1)
  2. Hook- und Callback-Funktionen (Teil 2)
  3. Wer braucht noch PHP?
  4. Hook- und Callback-Funktionen (Teil 3)
  5. Intype: Ein Editor, um die Welt zu verändern

michfrm meint dazu:

12. September 2007 um 14:35

Irgendjemand kann das sicher brauchen. ;)
Das Beispiel im PHP.net Manual ist nicht wirklich aufschlussreich, ich hab mich selbst auch schon oft gefragt: Wieso nicht einfach ne richtige Funktion schreiben?

michfrms Blog meint dazu:

12. September 2007 um 15:03

Temoräre Funktionen…

Ich hab gerade diesen Artikel gelesen und mir selbst mal ein paar Gedanken dazu gemacht.
Mit der PHP-Funktion create_funktion() lassen sich so genannte Lambda-Funktionen definieren.
Viel kann man mit diesen nicht machen außer Funktionen mit einem Befe…

Temoräre Funktionen - michfrms Blog meint dazu:

12. September 2007 um 15:03

[...] hab gerade diesen Artikel gelesen und mir selbst mal ein paar Gedanken dazu [...]

Sergej meint dazu:

12. September 2007 um 21:51

Ok, ok, ich bekenne mich schuldig: Ab und an verwende ich temporäre Funktionen, aber ausschliesslich für Sortier- oder Filteransätze - und das, wo mir die On-the-fly-Generierung der Funktion und damit verbundene Senkung der Performance klar und deutlich ist. Aber die Faulheit dafür eine extra Funktion zu schreiben hat in den meisten Fällen gesiegt.

Sebastian meint dazu:

13. September 2007 um 04:04

sergey:
Aber die Faulheit dafür eine extra Funktion zu schreiben hat in den meisten Fällen gesiegt.
/sergey

die definition mittels create_function ist im grunde diesselbe wie die normaler functions. was also wäre deine faulheit?

—-
nein, wie das manual sagt, könnten lambda funktionen bei callbacks nützlich sein, ganz und gärlich ohne benchmark verurteilen würde ich sie deshalb nicht.

ohne benchmark würde ich sagen, sie sind nützlich, wenn die funktion nur in den wenig bis fast garnicht auftretenden fällen eines codes genutzt wird, weil die funktionen eben nicht immer sondern nur bei diesen fällen registriert werden…

gruß

timi meint dazu:

13. September 2007 um 07:44

@all: Also ganz klar zeigt sich, das temporäre Funktionen eine deutlich längere Ausführungszeit haben als herkömmliche Funktionen. Warum, liegt auch auf der Hand: Nicht nur die Ausführung passiert zur Laufzeit, sondern auch die Deklaration - und das benötigt Zeit.

Ihr könnt ja mal bei Michael schauen, der hat das ganze mit einem rudimentären Benchmarktest unter die Lupe genommen…

Prinzipiell sollte man seine Includes sorgsam wählen und eben nur einbinden, wenn man sie wirklich benötigt. So schont man den Namensraum, den PHP Parser und fördert die Performance seiner Applikation.

Florian meint dazu:

14. September 2007 um 11:08

Diese Funktion habe ich bisher auch immer gemieden. Allein aus gründen der Übersichtlichkeit. Außerdem befindet sich mittlerweile mein gesamter Code in Klassen, da kann man für Callbacks, etc sich schnell eine neue Methode schreiben und wenn man mit Vorlagen arbeitet geht das sogar schneller…

Stefan meint dazu:

28. September 2007 um 11:52

Ob man Lamdba-Funktionen nützlich findet, ist sicherlich eine Frage des eigenen Programmierstils und der Sprachen, die man neben PHP sonst noch kennt und nutzt. Wer viel mit Perl (und dort mit sort, grep oder map) arbeitet oder mit Python oder gar mit Lisp und Co., für den ist der Einsatz von anonymen Funktionen die normalste Sache der Welt. Wer aber vor allem aus der C/C++/Java/PHP-Ecke kommt, der wundert sich, was das soll.
Ich persönlich finde den Zwang “richtige” Callback-Funktionen erstellen zu müssen, für ziemlich störend. Die Funktionalität in einer Callback-Funktion für eine Sortieranweisung gehört logisch zur Sortieranweisung - und nicht in eine Funktion, die im Quellcode u.U. weit davon entfernt steht. Ich finde auch nicht, dass anonyme Funktionen schlecht lesbar sind; das ist sicherlich eine Frage der Erfahrung im Umgang damit.
Trotzdem hat create_function() ein Riesenproblem: Das ist nicht die geringere Performance, sondern der Speicherbedarf! Der Garbage Collector kann nämlich den von create_function() belegten Speicher nicht frei geben. Mehr dazu auf meinem Blog: http://www.fischerlaender.net/php/php-create_function-ist-gefaehrlich

timi meint dazu:

28. September 2007 um 12:02

Danke für den wichtigen Hinweis Stefan. Ich werde den Artikel entsprechend erweitern… Wie man nun Callback-Funktionen verpackt und auslagert, ist ebenfalls eine Frage des Stils und nicht zwingend unübersichtlich.

Wenn man die selbe Sortierfunktion mehrmals benötigt, z.B. in einem Framework oder einer Applikation mit mehreren ähnlichen Collections, ist es durch aus sinnvoll ein entsprechendes Helper-Objekt mit entsprechenden statischen Funktionen bereitzustellen.

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung