O Xdebug não é categoricamente apenas uma função PHP, que era a solicitação original. Se você quiser, por exemplo, usar o nome da função de chamada na lógica PHP posterior e não instalar o XDebug nos servidores de produção, precisará de uma função PHP.
JP
Respostas:
198
Veja debug_backtrace - isso pode rastrear sua pilha de chamadas até o topo.
Veja como você chamaria o chamador:
$trace = debug_backtrace();
$caller = $trace[1];
echo "Called by {$caller['function']}";if(isset($caller['class']))
echo " in {$caller['class']}";
Parece-me que isso imprime o nome da função de chamada. Use list(, $caller) = debug_backtrace(false);para obter o chamador, falsepara desempenho ;-) (php5.3)
Znarkus
Muitas soluções vistas na Web obtêm o segundo elemento da matriz de backtrace para obter o chamador da instância: podemos ter tanta certeza disso? O segundo elemento é sempre o que estamos procurando? Eu pensei que um __construct () que inclui dentro de outra chamada, como parent :: __ construct (), poderia mudar de outra posição que o chamador real (ainda não tentou).
Emanuele Del Grande
1
Tentei verificar a ordem dos chamadores retornados durante o uso de um ReflectionClass e, obviamente, altera a posição do método "real" do chamador, que é visível na interface do usuário, para que nenhuma suposição sobre a posição do backtrace possa ser feita.
Emanuele Del Grande
4
o deslocamento da matriz removerá o primeiro elemento e retornará o elemento removido. A matriz original será modificada e isso deve dar o resultado pretendidoecho 'called by '.$trace[0]['function']
GoodSp33d
21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];para obter o nome do chamador com melhor desempenho.
Ahuigo 08/04
17
O Xdebug fornece algumas funções interessantes.
<?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();?>
retornará rastreio
callee() called @/var/www/xd.php:16fromMyClass::__construct
Para instalar o Xdebug no ubuntu, a melhor maneira é
É muito tarde, mas gostaria de compartilhar a função que fornecerá o nome da função a partir da qual a função atual é chamada.
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;}
O primeiro argumento impede o preenchimento de argumentos de função não utilizados, o segundo limita o rastreamento a dois níveis (precisamos do segundo).
/**
* 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;}}
Eu só queria afirmar que o caminho de flori não funcionará como uma função, pois sempre retornará o nome da função chamada em vez do chamador, mas não tenho reputação de comentar. Fiz uma função muito simples com base na resposta de flori que funciona bem no meu caso:
class basicFunctions{publicfunction getCallerFunction(){return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS,3)[2]['function'];}}
Respostas:
Veja debug_backtrace - isso pode rastrear sua pilha de chamadas até o topo.
Veja como você chamaria o chamador:
fonte
list(, $caller) = debug_backtrace(false);
para obter o chamador,false
para desempenho ;-) (php5.3)echo 'called by '.$trace[0]['function']
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
para obter o nome do chamador com melhor desempenho.O Xdebug fornece algumas funções interessantes.
retornará rastreio
Para instalar o Xdebug no ubuntu, a melhor maneira é
Você pode precisar instalar o php5-dev primeiro
mais informações
fonte
É muito tarde, mas gostaria de compartilhar a função que fornecerá o nome da função a partir da qual a função atual é chamada.
Espero que isso seja útil.
fonte
debug_backtrace()
fornece detalhes de parâmetros, chamadas de função / método na pilha de chamadas atual.fonte
Funciona desde o PHP 5.4 .
Ou otimizado (por exemplo, para casos de uso sem depuração):
O primeiro argumento impede o preenchimento de argumentos de função não utilizados, o segundo limita o rastreamento a dois níveis (precisamos do segundo).
fonte
Feito isso e usando isso sozinho
fonte
Eu só queria afirmar que o caminho de flori não funcionará como uma função, pois sempre retornará o nome da função chamada em vez do chamador, mas não tenho reputação de comentar. Fiz uma função muito simples com base na resposta de flori que funciona bem no meu caso:
EXEMPLO:
fonte
Você pode extrair essas informações da matriz retornada por debug_backtrace
fonte
Este funcionou melhor para mim:
var_dump(debug_backtrace());
fonte
Na verdade, acho que debug_print_backtrace () faz o que você precisa. http://php.net/manual/en/function.debug-print-backtrace.php
fonte
Isso deve funcionar:
fonte
Isso fará muito bem:
fonte