Du bist hier: StartPHPFunktionen › Aufrufer ermittelnDieses Snippet kommentieren

Aufrufende Funktion ermitteln

Diese Funktion gibt ein Array zurück, dem entnommen werden kann, wer die Funktion aufgerufen hat, die getCaller() aufgerufen hat. Wird getCaller() direkt aufgerufen, wird ein leeres Array zurückgegeben.

Wird die Funktion, die getCaller() aufruft, nicht durch das Script direkt, sondern von PHP ausgeführt (z.B. bei array_walk oder register_shutdown_function), so wird [PHPcore] als aufrufende Funktion angegeben und der Schlüssel ‘byphp’ auf true gesetzt.

Im Ergebnis sind die Felder line, file, function, caller und byphp enthalten.

function getCaller()
{
    $trace = array_slice(debug_backtrace(),1);
 
    // Wurde getCaller() nicht innerhalb einer Funktion aufgerufen?
 
    if ( count($trace) == 0 )
    {
        return array();
    }
 
    // OOP-Aufruf?
 
    if ( isset($trace[0]['class']) )
    {
        $trace[0]['function'] = $trace[0]['class'].$trace[0]['type'].$trace[0]['function'];
    }
 
    if ( isset($trace[1]['class']) )
    {
        $trace[1]['function'] = $trace[1]['class'].$trace[1]['type'].$trace[1]['function'];
    }
 
    // Im ersten Element steht, von wo aus die Funktion aufgerufen
    // wurde.
 
    $calledBy = array(
        'file'     => isset($trace[0]['file']) ? $trace[0]['file'] : '[PHPcore]',
        'line'     => isset($trace[0]['line']) ? $trace[0]['line'] : 0,
        'function' => $trace[0]['function'], // der Name der Fkt., die getCaller() aufgerufen hat
        'caller'   => '[PHPcore]',
        'byphp'    => false
    );
 
    // Falls wir noch ein Element im Array haben, dann wissen wir
    // sogar, wie die Funktion heißt, die die Funktion aufgerufen
    // hat.
 
    if ( count($trace) >= 2 )
    {
        $calledBy['caller'] = $trace[1]['function'];
    }
 
    // Falls die Funktion durch PHP aufgerufen wurde (array_walk o.ä.)
    // holen wir nicht den Aufruf durch array_walk (da wir das ja nicht
    // wissen können), sondern den Aufruf von array_walk.
 
    // Der Aufruf könnte auch von z.B. register_shutdown_function()
    // kommen. In dem Fall haben wir hingegen keine Angabe, wo
    // genau im Code register_shutdown_function aufgerufen
    // wurde.
 
    if ( $calledBy['file'] == '[PHPcore]' && count($trace) >= 2 )
    {
        $calledBy['file']  = $trace[1]['file'];
        $calledBy['line']  = $trace[1]['line'];
        $calledBy['byphp'] = true;
    }
 
    return $calledBy;
}

Das Hinzufügen von Kommentaren ist für dieses Snippet nicht erlaubt.