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']}";
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
ClassMyClass{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 =newMyClass();?>
wird Trace zurückgeben
callee() called @/var/www/xd.php:16fromMyClass::__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
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.
publicfunction 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;}
Das erste Argument verhindert das Auffüllen nicht verwendeter Funktionsargumente, das zweite begrenzt die Ablaufverfolgung auf zwei Ebenen (wir benötigen die zweite).
/**
* 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 functionif(isset($what)){return $previousCall[$what];}else{return $previousCall;}}
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{publicfunction getCallerFunction(){return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS,3)[2]['function'];}}
Antworten:
Siehe debug_backtrace - dies kann Ihren Aufrufstapel bis ganz nach oben verfolgen.
So erhalten Sie Ihren Anrufer:
quelle
list(, $caller) = debug_backtrace(false);
, um Anruferfalse
für die Leistung zu bekommen ;-) (php5.3)echo 'called by '.$trace[0]['function']
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
um den Namen des Anrufers mit besserer Leistung zu erhalten.Xdebug bietet einige nette Funktionen.
wird Trace zurückgeben
Um Xdebug auf Ubuntu zu installieren, ist der beste Weg
Möglicherweise müssen Sie zuerst php5-dev installieren
Mehr Info
quelle
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.
Ich hoffe das wird nützlich sein.
quelle
debug_backtrace()
liefert Details zu Parametern, Funktions- / Methodenaufrufen im aktuellen Aufrufstapel.quelle
Funktioniert seit PHP 5.4 .
Oder optimiert (z. B. für Nicht-Debug-Anwendungsfälle):
Das erste Argument verhindert das Auffüllen nicht verwendeter Funktionsargumente, das zweite begrenzt die Ablaufverfolgung auf zwei Ebenen (wir benötigen die zweite).
quelle
Habe das gemacht und das selbst benutzt
quelle
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:
BEISPIEL:
quelle
Sie können diese Informationen aus dem von debug_backtrace zurückgegebenen Array extrahieren
quelle
Dieser hat am besten für mich funktioniert:
var_dump(debug_backtrace());
quelle
Eigentlich denke ich, dass debug_print_backtrace () das tut, was Sie brauchen. http://php.net/manual/en/function.debug-print-backtrace.php
quelle
Das sollte funktionieren:
quelle
Das wird es gut machen:
quelle