Xdebug to kategorycznie nie tylko funkcja PHP, która była pierwotnym żądaniem. Jeśli chcesz np. Użyć nazwy funkcji wywołującej w późniejszej logice PHP i nie instalować XDebug na serwerach produkcyjnych, potrzebujesz funkcji PHP.
JP,
Odpowiedzi:
198
Zobacz debug_backtrace - to może prześledzić twój stos wywołań aż do samego początku.
Oto, jak możesz zdobyć dzwoniącego:
$trace = debug_backtrace();
$caller = $trace[1];
echo "Called by {$caller['function']}";if(isset($caller['class']))
echo " in {$caller['class']}";
Wydaje mi się, że wypisuje to nazwę funkcji wywoływanej. Użyj, list(, $caller) = debug_backtrace(false);aby uzyskać dzwoniącego, falsedo wykonania ;-) (php5.3)
Znarkus
Wiele rozwiązań dostępnych w sieci pobiera drugi element tablicy śledzenia wstecznego, aby uzyskać wywołujący instancję: czy możemy być tego tak pewni? Czy zawsze szukamy drugiego elementu? Pomyślałem, że __construct (), który zawiera wewnątrz innego wywołania, takiego jak parent :: __ construct (), może przesunąć o inną pozycję prawdziwego wywołującego (jeszcze nie próbowałem).
Emanuele Del Grande,
1
Próbowałem sprawdzić kolejność wywołań zwracanych podczas korzystania z ReflectionClass i oczywiście zmienia to pozycję „prawdziwej” metody wywołującej, która jest widoczna w interfejsie użytkownika, więc nie można poczynić żadnych założeń dotyczących pozycji śledzenia wstecznego.
Emanuele Del Grande,
4
array shift usunie pierwszy element i zwróci usunięty element. Oryginalna tablica zostanie zmodyfikowana, co powinno dać wymagany wynikecho 'called by '.$trace[0]['function']
GoodSp33d
21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];aby uzyskać nazwę dzwoniącego z lepszą wydajnością.
ahuigo
17
Xdebug zapewnia kilka fajnych funkcji.
<?phpClassMyClass{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();?>
zwróci ślad
callee() called @/var/www/xd.php:16fromMyClass::__construct
Aby zainstalować Xdebug na Ubuntu, najlepszym sposobem jest
sudo aptitude install php5-xdebug
Być może będziesz musiał najpierw zainstalować php5-dev
To bardzo późno, ale chciałbym udostępnić funkcję, która poda nazwę funkcji, z której jest wywoływana bieżąca funkcja.
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;}
/**
* 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;}}
Chciałem tylko powiedzieć, że sposób flori nie będzie działał jako funkcja, ponieważ zawsze zwróci nazwę wywoływanej funkcji zamiast wywołującego, ale nie mam reputacji komentowania. Stworzyłem bardzo prostą funkcję opartą na odpowiedzi flori, która działa dobrze w moim przypadku:
class basicFunctions{publicfunction getCallerFunction(){return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS,3)[2]['function'];}}
Odpowiedzi:
Zobacz debug_backtrace - to może prześledzić twój stos wywołań aż do samego początku.
Oto, jak możesz zdobyć dzwoniącego:
źródło
list(, $caller) = debug_backtrace(false);
aby uzyskać dzwoniącego,false
do wykonania ;-) (php5.3)echo 'called by '.$trace[0]['function']
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
aby uzyskać nazwę dzwoniącego z lepszą wydajnością.Xdebug zapewnia kilka fajnych funkcji.
zwróci ślad
Aby zainstalować Xdebug na Ubuntu, najlepszym sposobem jest
Być może będziesz musiał najpierw zainstalować php5-dev
więcej informacji
źródło
To bardzo późno, ale chciałbym udostępnić funkcję, która poda nazwę funkcji, z której jest wywoływana bieżąca funkcja.
Mam nadzieję, że to się przyda.
źródło
debug_backtrace()
dostarcza szczegóły parametrów, wywołań funkcji / metod w bieżącym stosie wywołań.źródło
Działa od PHP 5.4 .
Lub zoptymalizowany (np. Dla przypadków użycia innych niż debugowanie):
Pierwszy argument zapobiega wypełnianiu nieużywanych argumentów funkcji, drugi ogranicza śledzenie do dwóch poziomów (potrzebujemy drugiego).
źródło
Zrobiłem to i używając tego sam
źródło
Chciałem tylko powiedzieć, że sposób flori nie będzie działał jako funkcja, ponieważ zawsze zwróci nazwę wywoływanej funkcji zamiast wywołującego, ale nie mam reputacji komentowania. Stworzyłem bardzo prostą funkcję opartą na odpowiedzi flori, która działa dobrze w moim przypadku:
PRZYKŁAD:
źródło
Możesz wyodrębnić te informacje z tablicy zwróconej przez debug_backtrace
źródło
Ten działał najlepiej dla mnie:
var_dump(debug_backtrace());
źródło
Właściwie myślę, że debug_print_backtrace () robi to, czego potrzebujesz. http://php.net/manual/en/function.debug-print-backtrace.php
źródło
To powinno działać:
źródło
To ładnie to zrobi:
źródło