am 12. Februar 2010
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.