Name der Anruferfunktion in PHP abrufen?

135

Gibt es eine PHP-Funktion, um den Namen der Aufruferfunktion in einer bestimmten Funktion herauszufinden?

miken32
quelle
Sie sollten Xdebug verwenden. Siehe meine Antwort in diesem Beitrag: stackoverflow.com/questions/1513069/…
svassr
13
Xdebug ist kategorisch nicht nur eine PHP-Funktion, die die ursprüngliche Anforderung war. Wenn Sie beispielsweise den Namen der Aufruferfunktion in einer späteren PHP-Logik verwenden und XDebug nicht auf Produktionsservern installieren möchten, benötigen Sie eine PHP-Funktion.
JP

Antworten:

198

Siehe debug_backtrace - dies kann Ihren Aufrufstapel bis ganz nach oben verfolgen.

So erhalten Sie Ihren Anrufer:

$trace = debug_backtrace();
$caller = $trace[1];

echo "Called by {$caller['function']}";
if (isset($caller['class']))
    echo " in {$caller['class']}";
Paul Dixon
quelle
59
Es scheint mir, dass dies den Namen der Angerufenenfunktion druckt. Verwenden Sie list(, $caller) = debug_backtrace(false);, um Anrufer falsefür die Leistung zu bekommen ;-) (php5.3)
Znarkus
Viele im Web gesehene Lösungen erhalten das zweite Element des Backtrace-Arrays, um den Instanzaufrufer zu erhalten: Können wir uns so sicher sein? Ist das zweite Element immer das, nach dem wir suchen? Ich dachte, ein __construct (), das in einem anderen Aufruf wie parent :: __ construct () enthalten ist, könnte den realen Aufrufer (noch nicht ausprobiert) von einer anderen Position verschieben.
Emanuele Del Grande
1
Ich habe versucht, die Reihenfolge der zurückgegebenen Anrufer zu überprüfen, während eine ReflectionClass verwendet wurde, und es ändert offensichtlich die Position der "echten" Aufrufermethode, die in der Benutzeroberfläche sichtbar ist, sodass keine Annahme über die Position der Rückverfolgung gemacht werden kann.
Emanuele Del Grande
4
Array Shift entfernt das erste Element und gibt das entfernte Element zurück. Das ursprüngliche Array wird geändert und dies sollte das erforderliche Ergebnis echo 'called by '.$trace[0]['function']
liefern
21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];um den Namen des Anrufers mit besserer Leistung zu erhalten.
Ahuigo
17

Xdebug bietet einige nette Funktionen.

<?php
  Class MyClass
  {
    function __construct(){
        $this->callee();
    }
    function callee() {
        echo sprintf("callee() called @ %s: %s from %s::%s",
            xdebug_call_file(),
            xdebug_call_line(),
            xdebug_call_class(),
            xdebug_call_function()
        );
    }
  }
  $rollDebug = new MyClass();
?>

wird Trace zurückgeben

callee() called @ /var/www/xd.php: 16 from MyClass::__construct

Um Xdebug auf Ubuntu zu installieren, ist der beste Weg

sudo aptitude install php5-xdebug

Möglicherweise müssen Sie zuerst php5-dev installieren

sudo aptitude install php5-dev

Mehr Info

svassr
quelle
15

Dies ist sehr spät, aber ich möchte die Funktion teilen, die den Namen der Funktion angibt, von der die aktuelle Funktion aufgerufen wird.

public function getCallingFunctionName($completeTrace=false)
    {
        $trace=debug_backtrace();
        if($completeTrace)
        {
            $str = '';
            foreach($trace as $caller)
            {
                $str .= " -- Called by {$caller['function']}";
                if (isset($caller['class']))
                    $str .= " From Class {$caller['class']}";
            }
        }
        else
        {
            $caller=$trace[2];
            $str = "Called by {$caller['function']}";
            if (isset($caller['class']))
                $str .= " From Class {$caller['class']}";
        }
        return $str;
    }

Ich hoffe das wird nützlich sein.

MANISH ZOPE
quelle
1
Gern geschehen David !!! Ich benutze dies auch zum Debuggen in meinem Projekt :)
MANISH ZOPE
Der Modus "Vollständige Ablaufverfolgung" ist sehr nützlich. Danke für das Teilen.
Leopoldo Sanczyk
15

debug_backtrace() liefert Details zu Parametern, Funktions- / Methodenaufrufen im aktuellen Aufrufstapel.

CMS
quelle
9
echo debug_backtrace()[1]['function'];

Funktioniert seit PHP 5.4 .

Oder optimiert (z. B. für Nicht-Debug-Anwendungsfälle):

echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];

Das erste Argument verhindert das Auffüllen nicht verwendeter Funktionsargumente, das zweite begrenzt die Ablaufverfolgung auf zwei Ebenen (wir benötigen die zweite).

flori
quelle
7

Habe das gemacht und das selbst benutzt

/**
 * Gets the caller of the function where this function is called from
 * @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
 */
function getCaller($what = NULL)
{
    $trace = debug_backtrace();
    $previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function

    if(isset($what))
    {
        return $previousCall[$what];
    }
    else
    {
        return $previousCall;
    }   
}
Paul Gobée
quelle
3

Ich wollte nur sagen, dass Floris Weg nicht als Funktion funktioniert, weil er immer den aufgerufenen Funktionsnamen anstelle des Aufrufers zurückgibt, aber ich habe keinen Ruf für Kommentare. Ich habe eine sehr einfache Funktion basierend auf Floris Antwort erstellt, die für meinen Fall gut funktioniert:

class basicFunctions{

    public function getCallerFunction(){
        return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function'];
    }

}

BEISPIEL:

function a($authorisedFunctionsList = array("b")){
    $ref = new basicFunctions;
    $caller = $ref->getCallerFunction();

    if(in_array($caller,$authorisedFunctionsList)):
        echo "Welcome!";
        return true;
    else:
        echo "Unauthorised caller!";
        return false; 
    endif;
}

function b(){
    $executionContinues = $this->a();
    $executionContinues or exit;

    //Do something else..
}
lrd
quelle
2

Dieser hat am besten für mich funktioniert: var_dump(debug_backtrace());

Gershon Herczeg
quelle
1

Das sollte funktionieren:

$caller = next(debug_backtrace())['function'];
Kenorb
quelle
0

Das wird es gut machen:


// Outputs an easy to read call trace
// Credit: https://www.php.net/manual/en/function.debug-backtrace.php#112238
// Gist: https://gist.github.com/UVLabs/692e542d3b53e079d36bc53b4ea20a4b

Class MyClass{

public function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();
   
    for ($i = 0; $i < $length; $i++)
    {
        $result[] = ($i + 1)  . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }
   
    return "\t" . implode("\n\t", $result);
}

}

// call function where needed to output call trace

/**
Example output:
1) /var/www/test/test.php(15): SomeClass->__construct()
2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
**/```
Uriahs Victor
quelle