Start · Sprachen · PHP · Referenz · call_user_func_array

call_user_func_array

Funktion

Ruft einen beliebigen Callback auf und übergibt die Parameter als Array.

seit PHP 4.0.4 Kategorie: oop

Signatur

call_user_func_array(callable $callback, array $args): mixed

Beschreibung

call_user_func_array() ermöglicht es, eine Funktion, eine Methode oder ein Closure dynamisch aufzurufen, wobei die Argumente als indexiertes Array übergeben werden. Die Elemente des Arrays werden dabei als einzelne Positionsparameter an den Callback weitergegeben – ähnlich dem Spread-Operator ...$args.

Typische Einsatzszenarien sind Dispatcher-Architekturen, Middleware-Pipelines, Dekorator-Muster oder jede Situation, in der die Anzahl der Argumente erst zur Laufzeit bekannt ist. Auch beim Weiterleiten von Argumenten in __call()-Magic-Methoden wird diese Funktion häufig eingesetzt.

Als $callback sind alle PHP-callable-Werte erlaubt: einfache Funktionsnamen als String, [$object, 'methode']-Arrays für Instanzmethoden, ['Klasse', 'statischeMethode'] für statische Methoden sowie anonyme Funktionen und Closures.

Seit PHP 5.6 kann der Spread-Operator ...$args als kompaktere Alternative genutzt werden: $callback(...$args). Bei sehr performance-kritischem Code ist der Spread-Operator zu bevorzugen, da er keinen zusätzlichen Funktionsaufruf-Overhead erzeugt.

Parameter

Name Typ Default Beschreibung
$callback Pflicht callable Der aufzurufende Callback. Erlaubt sind Funktionsnamen als String, [$object, 'methode']-Arrays, 'Klasse::methode'-Strings, Closures und Objekte mit __invoke()-Methode.
$args Pflicht array Indexiertes Array der Parameter, die als einzelne Argumente an den Callback übergeben werden. Ein leeres Array [] ruft den Callback ohne Argumente auf.

Rückgabewert

Typ
mixed
Beschreibung
Gibt den Rückgabewert des aufgerufenen Callbacks zurück, oder false im Fehlerfall (z. B. wenn der Callback nicht auflösbar ist). Gibt der Callback selbst false zurück, ist eine Unterscheidung nur über eine explizite Prüfung möglich.

Beispiele

Einfacher Funktionsaufruf mit Argument-Array

<?php
function addiere(int $a, int $b): int {
    return $a + $b;
}

$args = [10, 32];
$ergebnis = call_user_func_array('addiere', $args);
echo $ergebnis; // 42
42

Aufruf einer Instanzmethode über __call()

<?php
class Logger {
    private string $prefix;

    public function __construct(string $prefix) {
        $this->prefix = $prefix;
    }

    public function log(string $level, string $message): void {
        echo "[{$this->prefix}][$level] $message" . PHP_EOL;
    }

    public function __call(string $name, array $arguments): mixed {
        // Argumente dynamisch an eine andere Methode weiterleiten
        return call_user_func_array([$this, 'log'], array_merge([$name], $arguments));
    }
}

$logger = new Logger('App');
$logger->warning('Datei nicht gefunden');
[App][warning] Datei nicht gefunden

Statische Methode und Spread-Operator als moderne Alternative

<?php
class MathHelper {
    public static function multipliziere(int $a, int $b, int $c): int {
        return $a * $b * $c;
    }
}

$args = [2, 3, 7];

// Klassisch mit call_user_func_array
$ergebnis1 = call_user_func_array(['MathHelper', 'multipliziere'], $args);
echo $ergebnis1 . PHP_EOL; // 42

// Moderne Alternative ab PHP 5.6
$ergebnis2 = MathHelper::multipliziere(...$args);
echo $ergebnis2 . PHP_EOL; // 42
42 42

// Wichtig · Fallstricke

Sicherheitshinweis: Wird der $callback-Parameter aus Nutzereingaben oder externen Quellen befüllt, besteht ein erhebliches Sicherheitsrisiko (Remote Code Execution). Callback-Werte müssen stets gegen eine Allowlist geprüft werden, bevor sie an call_user_func_array() übergeben werden.

Performance: Ab PHP 5.6 ist der Spread-Operator ($fn(...$args)) die bevorzugte Alternative, da er als Sprachkonstrukt schneller ausgeführt wird und keine zusätzliche interne Wrapper-Funktion benötigt.

Referenzparameter: Bis PHP 5.3 konnten Argumente per Referenz übergeben werden, indem die Array-Elemente als Referenzen definiert wurden. Ab PHP 5.4 wird dies nicht mehr unterstützt und erzeugt eine Warnung. Referenzparameter sollten stattdessen direkt im Funktionsaufruf deklariert werden.