Vorteile von call_user_func

Fragenfrager

Erfahrenes Mitglied
Hallo liebes Forum,

in der PHP-Dokumentation stieß ich gerade auf call_user_func und den Beispielcode:
PHP:
function friseur ($type) {
    print "Sie möchten einen $type-Kopf, kein Problem<br>";
}
call_user_func ('friseur', "Bubi");
call_user_func ('friseur', "Pilz");
Ich habe bisher immer so gescriptet:
PHP:
function friseur ($type) {
    print "Sie möchten einen $type-Kopf, kein Problem<br>";
}
friseur("Bubi");
friseur("Pilz");

Gibt es außer der vielleicht besseren Übersichtlichkeit -dass "friseur" eine benutzerdefinierte Funktion ist- noch einen anderen Grund, hier call_user_func zu verwenden?
 
In der Anwendung macht es keinen Sinn. die call_user_func() habe ich selber noch nie angwendet. Ansderst sieht es mit der call_user_func_array() aus.

Als Beispiel habe ich mal eine Klasse mit einer Statischen Methode. Dass ich diese Methode der Klasse aufrufen will, ist in Konstanten gespeichert. Es ist also definitiv kein Aufruf mit $$functioname() möglich.

PHP:
class Worker{
    static function doAnything($function){
        $params = func_get_args();
        //$function entfernen, die hab ich ja beeits in $function
        array_shift($params);
        //Mache irgendwas das den Wrapper gerechtfertigt
        echo "<p>Führe {$function}() mit den Parametern ('" . implode("', '" , $params) . "') aus:<br />";
        //Und führe die gewünschte Funktion aus
        return call_user_func_array($function, $params);
        echo '</p>';
    }
}

define('C_CLASS', 'Worker');
define('C_METHOD', 'doAnything');
define('C_FUNCTION', 'trim');

$params[] = C_FUNCTION;     //Name der Funktion die innerhalb der Method doAnything() ausgeführt werden soll
//Und die Parameter für die Funktion trim()
$params[] = '   abcd###';
$params[] = ' #';

echo call_user_func_array(array(C_CLASS, C_METHOD), array(C_FUNCTION, '   abcd###', ' #'));

//zweiter Test. Ein direkter Aufruf mit einer Parameterliste. doAnything() handelt dass dan schon richtig. 
echo Worker::doAnything('sprintf', 'Hallo %s. Mein Gruss nach %s.', 'Fragenfrager', 'Berlin');
Ausgabe:
Code:
Führe trim() mit den Parametern (' abcd###', ' #') aus:
abcd

Führe sprintf() mit den Parametern ('Hallo %s. Mein Gruss nach %s.', 'Fragenfrager', 'Berlin') aus:
Hallo Fragenfrager. Mein Gruss nach Berlin.


PS: Es geht auch mit PHP-Eigene Funktionen, nicht nur User-Funktionen wie in der PHP-Doku beschrieben
 
Irgendwann im Programmiererleben kommst du mal an einen Punkt, an dem du mit Bordmitteln nicht weiterkommst. Es reicht, wenn es dann klingelt und dir call_user_func_array() einfällt. Ich gebe Yaslaw recht, dass man call_user_func() fast gar nicht braucht.

Bis dahin würde ich diese Sache verschieben und mich mit wichtigerem beschäftigen :-)
 
Zurück