Facebook
Twitter
Google+
Kommentare
20

Warum call_user_func() vielleicht doch nicht so böse ist?!

Heute wird wieder einer dieser Tage sein, an dem ich einen Artikel schreibe und ich noch gar nicht weiß, wie er ausgehen wird. Also schon mal sorry, falls meine Meinung von Anfang des Textes bis zum Ende nicht die gleiche bleibt. Auf jeden Fall geht es um call_user_func. Bis gestern war ich mir sicher, dass es eine der fiesesten Funktionen aus PHP ist. Auch wenn man sich richtig einsetzt.

Während ich den Artikel gestern geschrieben hatte, wurde mir klar, dass es vielleicht in den richtigen Händen doch gar nicht so böse sein muss. Ich bin davon ausgegangen, dass man, sobald call_user_func() im Einsatz hat, keine Aussage mehr über seinen Code treffen kann und eine Analyse somit fast unmöglich ist. Das stimmt aber nicht so ganz. Nutz man cuf (call_user_func … ich bin zu faul zum schreiben) so, dass man nur Methoden/Funktionen aufruft, die den selben Rückgabetyp besitzen, so kann man damit wohl doch sauber arbeiten. Mal ein Beispiel:

/* @return Trans_Mogrifier */
function createHotTransmogrifier( )
{

}

/* @return Trans_Mogrifier */
function createCoolTransmogrifier( )
{

}

/* @return Trans_Mogrifier */
function createTransmogrifier( $type )
{
  call_user_func( 'create'.$type.'Transmogrifier' );
}

Sorry übrigens, wenn die Beispiele gerade ein wenig hinken, aber ich bin noch in der Ideenfindungsphase (und außerdem ist grad Fasching). So jetzt habe ich eine prozedurale Factory gebaut. Super oder? Naja nicht wirklich OOP hätte mir hier schönere Lösung geliefert. Aber setzen wir doch mal den Qualtitätsmanagement Hut auf. natürlich ist es schwer rauszufinden, welche Methoden niemals aufgerufen werden, aber bei Factories habe ich immer dieses Problem, egal wie sauber und OOP ich programmiere. Das kann dann also kein Rückschritt sein. Falls übrigens jemand genau wissen will, was eine Factory Method ist, dann in der Ideenschmiede voten, da ist es nämlich ganz weit vorne.

Was ich also sagen will. Solange man nicht irgendwie wild mit call_user_func um sich wirft und es nur verwendet um mit festen Rückgabetypen zu hantieren, kann man das sauber nutzen. Man sollte aber immer den Factory und Interface Gedanken vor Augen haben, denn dort bekommt man des Öfteren eine bessere Lösung.

Jetzt wo der Artikel fertig ist, habe ich das Gefühl, dass er ziemlich konfus geworden ist. Ist mir aber egal. Mir wurde einiges über call_user_func klar und in der nächsten Version eines Berichtes über dieses Funktionsungetüm kann ich meine Gedanken bestimmt besser ausdrücken.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

20 Comments

  1. Was ist den Fasching in Hamburg fuer eine Ausrede?!!

    Versteh ich dich richtig, dass eine statische Code Analyse hier greifen kann, weil du @return fuer die createTransmogrifier() angegeben hast? Oder bist du in der Lage diese Info auch vom cuf call selber zu bekommen? Denn createTransmogrifier() ist ja in deinem Faschings-Beispiel nur ein Wrapper fuer cuf.

    Wie sieht das aus, wenn cuf mitten im (Spaghetti-)Code steht?

    Reply
  2. Ohne call_user_func_* sind an einigen Stellen Callbacks als Parameter kaum möglich. Wenn man sich nicht unbedingt auf OOP versteift und eine Multiparadigmen-Sprache sein lässt, was sie gerne sein möchte, ist das ein mächtiges Werkzeug 😉

    Reply
  3. Letztendlich wird die Funktion in vielen kleineren OpenSource Projekten verwendet um eine API Schnittstelle zu schaffen, konkrete Probleme damit hatte ich bei der Template Engine Dwoo.

    Ich denke eine einigermaßen akzeptable Benutzung kannst du nur gewähren, wenn du den Rückgabe Wert eindeutig prüfen kannst, was jedoch letztendlich in der Funktion selbst passiert kannst du ja nicht wissen.

    Mir hat die is_callable() Funktion beim prüfen geholfen, in den Beispielen sind einige interessante Ideen:
    http://de3.php.net/manual/en/function.is-callable.php

    Reply
  4. Wenn wir schon darüber sprechen, sollte dennoch davor gewarnt werden, die Steuerung dieser Funktion zu offen zu lassen.

    Benutzereingaben dürfen auf keinem Weg (roh) in diese Funktion gelangen und der Präfix und Suffix sollte aus diesem Grund gut bedacht werden, ebenso wie die Überprüfung der eingegebenen Werte, sonst stehen Angreifern Tür und Tor offen.

    Sollte natürlich für einen guten Entwickler selbstverständlich sein.

    Wie sieht das eigentlich mit dem Exceptionhandling über solche Funktionen hinweg aus? Verhält sich das ordentlich? Ich bin mir nicht ganz sicher, glaube aber es funktioniert.

    Reply
  5. Noch ein Beispiel:

    class ReflectionMethod
    {
    public function invoke($instance, $args)
    {
    return call_user_func_array(array($instance, $this->methodName), $args);
    }
    }

    Reply
  6. Deine Rechtschreibung ist unter aller Sau (sorry) und macht es langsam nicht mehr angenehm, deine Artikel zu lesen…

    Auf einem Blog mit so vielen Besuchern sollte man sich evtl. mal anstrengen, findest du nicht? Ich bin sicher nicht der einzige, dem es so geht.

    Insbesondere störend finde ich:
    – „Deppenleerzeichen“
    – Tippfehler
    – Kommafehler

    Außerdem hast du es nicht so mit der Shift-Taste…

    MfG
    Simon

    Reply
  7. @Sven&Simon: Ja ihr habt Recht. Es gibt Tage, da sitze ich in der Bahn, tippe den Artikel und habe auch danach keine Lust bzw. Zeit mehr in Korrektur zu lesen. Dann passiert es, dass mal was „unter aller Sau“ online geht. Das ist mir klar und im Moment kann ich damit leben. Falls ihr den Blog wirklich gerne lest, dann hätte ich lieber von euch eine Idee dazu gehabt, wie man auch an solchen Tagen korrekt bleiben kann und nicht nur ein Gemotze. Falls jemand von euch einen Account haben will, in dem er Fehler ausbessert und sich jeden Tag die Mühe machen will/würde, bin ich sofort dabei. Nur so als Kommentar finde ich es ein wenig zu einfach.
    Gruß, Nils

    Reply
  8. Da Nils das ganze in seiner Freizeit betreibt, finde ich kann man das auch ein bisschen lockerer sehen. Blogs sind doch keine Diktate und ich kann es gut verstehen, dass man die Zeit zum Korrekturlesen nicht immer hat. Andernfalls müsste sich die Schlagzahl dann halt deutlich verringern. Es ist wie mit der Kunst, wems nicht gefällt muss es ja nicht ansehen 😉

    Reply
  9. @Nils
    Kleiner Tipp: Ich habe mir mittlerweile angewöhnt sämtliche Texte in Word mit aktivierten Duden Korrektor zu verfassen. Mit Duden Korrektor und Word kannst du in Ausnahmefällen (keine Zeit / Lust) auch fast auf ein Korrekturlesen verzichten. Duden Korrektor prüft nämlich während des Schreibens auf Rechtschreibung, Grammatik, Zeichensetzung, Abkürzungen, Schreibvarianten und Schreibstil. Und das immer auf Basis der geltenden Rechtschreibregeln.

    Reply
  10. @#4: $$functionname funktioniert nicht bei Array notation array(‚Klasse‘,’Methode‘) bzw array($object,’Methode‘)

    @#5: Das Userdaten nie ungefiltert irgendwo reingeworfen werden dürfen, ist unabhängig von dieser Funktion.

    @#9: Versteh ich das richtig: Damit wir deine Beiträge gerne lesen, sollen wir sie selbst korrigieren? Klingt paradox …
    Alternative wäre zB die Beiträge den Abend vorher zu Schreiben, oder vielleicht nicht sofort um 7 Uhr morgens reinzustellen, wenn du damit selbst nicht zufrieden bist 😉

    Reply
  11. Wenn du mich dafür bezahlst, dass ich alle deine Artikel korrigiere: Gerne! Kannst mich ja mal anschreiben.

    Ich denke, dass du westentlich mehr Leser hättest, wenn du deine Beiträge ordentlich schreiben würdest. Übrigens mag Google das auch.

    Reply
  12. Hm, leider wurde mein letzter Kommentar entfernt?! Also nochmal, es geht hier um fachliche und euer Gemecker kann ich gar nicht verstehen. Deshalb: Danke Nils das du dir JEDEN Tag die Mühe machst uns einen Artikel zu schreiben.
    Zu der letzten Antwort von Simon fällt mir einer deiner Artikel ein über Kollegen die nicht im Team mitarbeiten wollen und über jeden Vorschlag meckern ^^

    Reply
  13. @Simon: „Wenn du mich dafür bezahlst, dass ich alle deine Artikel korrigiere: Gerne!“ das ist schon irgendwie leicht dreist, oder? Nils schreibt hier täglich Artikel mehr oder weniger nur aus Spaß der Community damit einen netten Dienst zu erweisen und du erwartest dafür bezahlt zu werden.
    @Nils: Der Tipp mit dem Duden-Korrektor ist garnicht so schlecht. Zur allgemeinen Artikel-Qualität: Die Rechtschreibung heute ist mir heute sogar schon negativ aufgefallen (obwohl ich da eigentlich nicht so pingelig bin und du mir da bis her auch noch nicht auffällig geworfen bist). Ob du daran nun was ändern möchtest bleibt allein dir überlassen. Letztendlich musst du ja wissen was du für einen qualitativen Anspruch an deine Texte hast. Vielleicht kannst du aber auch die Texte einfach mal am Tag vorher von Kollegen oder deiner Freundin gegen lesen lassen, schaden kann das ja nicht – vielleicht finden sich ja beim ein oder anderen Artikel ja auch noch Verbesserungsvorschläge unabhängig von der Rechtschreibung (Struktur, Inhalt?).

    Reply
  14. Da geht ihr aber ganz schön hart mit Nils ins Gericht. Das ganze ist kein kommerzieller Blog, jeden Tag einen Artikel zu schreiben ist manchmal echt harte Arbeit. Man muss das mal selbst einige Wochen versuchen und wird dann feststellen, dass das garnicht so einfach ist wie man glaubt, wirklich täglich einen Beitrag zu schreiben.

    Ich habe mich damals bei Eröffnung meines Blogs dafür entschieden, mich nicht so unter Druck zu setzen und lieber nur alle paar Tage einen Artikel zu veröffentlichen, dafür aber so hochwertig wie es mir zeitlich möglich ist. Aber umso lieber ist mir Nils Blog, wo ich morgens meine tägliche Dosis bekommen kann, wenn auch manchmal nicht überall korrekt. Das Wichtige kann man auch mitnehmen incl. ein paar Rechtschreibfehlern. So sehe ich das.

    Reply
  15. Ich schließe mich meinem Vorredner an. Es handelt sich hierbei ja nicht um einen kommerziellen Blog oder gar eine journalistische Seite (und guckt euch selbst mal da die Inhalte an… das wird auch immer schlimmer, sollte aber keine Entschuldigung sein)!

    Letztendlich finde ich diesen Blog gerade deshalb gut, weil jeden Tag ein netter Artikel online ist, der vielleicht nicht immer den höchsten Ansprüchen genügt, aber dennoch gute Themen kurz und prägnant anreißt.

    Wenn man Kritik an der Schreibweise oder den Inhalten hat, darf man das gerne mal freundlich sagen, aber nicht so wie ihr das tut, weil DAS ist wirklich unter aller Sau (und nicht Nils Schreibweise)!

    Letztendlich können alle etwas daraus lernen. Nils würde ich auch empfehlen die Inhalte in Word mit Korrektur zu tippen, da erledigen sich die meisten Fehler.
    Allen Meckerern kann ich nur sagen… entweder ihr mögt den Blog und lest ihn weiter… oder ihr helft ihn durch eure Mitarbeit zu verbessen (wenn ihr selbst aktiv Artikel schreibt, hat Nils weniger Zeitdruck und kann sich mehr auf die Inhalte konzentrieren).

    Ich find’s jedenfalls nicht gut, so unkonstruktiv miteinander umzugehen.

    Hoffe mein Kommentar hat nicht zu viele Rechtschreibfehler, sodass ich gleich auch von euch zerrissen werde 😉

    Reply
  16. Ja, sicher kann man Nils nicht dazu zwingen.
    Ich denke nur, dass es angenehmer wäre, die Artikel zu lesen, wenn man nicht jeden Satz 3 mal lesen müsste (jetzt mal übertrieben gesagt).

    Insbesondere das Deppenleerzeichen hemmt den Lesefluß doch sehr.

    Reply
  17. Ehrlichgesagt finde ich die Fehler ab und zu heftig und schwer zu lesen, ABER dadurch das Nils dies offensichtlich in der Bahn und ab und zu unter „Zeitdruck“ macht, ist es für mich zumindest vertretbar.
    Vorallem weil es hier wirklich JEDEN Morgen etwas zu lesen gibt und mir zumindest vorallem der Inhalt wichtig ist..

    Aber kleiner Tipp am Rande: Ich benutzer das Dictionary Add-on für den Firefox.
    Vor dem Posten noch schnell mal auf Fehler prüfen und fertig:)

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen