Xdebug - это не просто функция PHP, которая была исходным запросом. Если вы хотите, например, использовать имя функции вызывающей стороны в более поздней логике PHP и не устанавливать XDebug на производственных серверах, вам нужна функция PHP.
JP
Ответы:
198
Смотрите debug_backtrace - это может отследить ваш стек вызовов до самого верха.
Вот как бы вы получили своего абонента:
$trace = debug_backtrace();
$caller = $trace[1];
echo "Called by {$caller['function']}";if(isset($caller['class']))
echo " in {$caller['class']}";
Мне кажется, что это печатает имя функции вызываемого абонента. Используйте list(, $caller) = debug_backtrace(false);для получения звонящего, falseдля производительности ;-) (php5.3)
Znarkus
Многие решения, встречающиеся в сети, получают второй элемент массива backtrace для вызова вызывающего экземпляра: можем ли мы быть в этом уверены? Всегда ли второй элемент - тот, который мы ищем? Я думал, что __construct (), который включает в себя другой вызов, такой как parent :: __ construct (), может сместить другую позицию реального абонента (еще не пробовал).
Эмануэле Дель Гранде
1
Я попытался проверить порядок вызовов, возвращаемых при использовании ReflectionClass, и он, очевидно, меняет позицию «реального» метода вызывающего, который виден в пользовательском интерфейсе, поэтому никакие предположения относительно позиции обратной трассировки не могут быть сделаны.
Эмануэле Дель Гранде
4
сдвиг массива удалит первый элемент и вернет удаленный элемент. Исходный массив будет изменен, и это должно дать требуемый результатecho 'called by '.$trace[0]['function']
GoodSp33d
21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];чтобы получить имя звонящего с лучшей производительностью.
Ахуиго
17
Xdebug предоставляет несколько приятных функций.
<?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();?>
вернет след
callee() called @/var/www/xd.php:16fromMyClass::__construct
Чтобы установить Xdebug на Ubuntu, лучше всего
sudo aptitude install php5-xdebug
Вам может понадобиться сначала установить php5-dev
Это очень поздно, но я хотел бы поделиться функцией, которая даст имя функции, из которой вызывается текущая функция.
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;}}
Я просто хотел заявить, что способ flori не будет работать как функция, потому что он всегда будет возвращать имя вызываемой функции вместо вызывающего, но у меня нет репутации комментировать. Я сделал очень простую функцию, основанную на ответе Флори, которая отлично подходит для моего случая:
class basicFunctions{publicfunction getCallerFunction(){return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS,3)[2]['function'];}}
Ответы:
Смотрите debug_backtrace - это может отследить ваш стек вызовов до самого верха.
Вот как бы вы получили своего абонента:
источник
list(, $caller) = debug_backtrace(false);
для получения звонящего,false
для производительности ;-) (php5.3)echo 'called by '.$trace[0]['function']
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
чтобы получить имя звонящего с лучшей производительностью.Xdebug предоставляет несколько приятных функций.
вернет след
Чтобы установить Xdebug на Ubuntu, лучше всего
Вам может понадобиться сначала установить php5-dev
больше информации
источник
Это очень поздно, но я хотел бы поделиться функцией, которая даст имя функции, из которой вызывается текущая функция.
Я надеюсь, что это будет полезно.
источник
debug_backtrace()
предоставляет сведения о параметрах, вызовах функций / методов в текущем стеке вызовов.источник
Работает с PHP 5.4 .
Или оптимизирован (например, для случаев не отладки):
Первый аргумент предотвращает заполнение неиспользуемых аргументов функции, второй ограничивает трассировку двумя уровнями (нам нужен второй).
источник
Сделал это и использую это сам
источник
Я просто хотел заявить, что способ flori не будет работать как функция, потому что он всегда будет возвращать имя вызываемой функции вместо вызывающего, но у меня нет репутации комментировать. Я сделал очень простую функцию, основанную на ответе Флори, которая отлично подходит для моего случая:
ПРИМЕР:
источник
Вы можете извлечь эту информацию из массива, возвращенного debug_backtrace
источник
Этот работал лучше всего для меня:
var_dump(debug_backtrace());
источник
На самом деле я думаю, что debug_print_backtrace () делает то, что вам нужно. http://php.net/manual/en/function.debug-print-backtrace.php
источник
Это должно работать:
источник
Это сделает это красиво:
источник