php获取函数调用执行回溯

2021-10-22
//产生一条PHP的回溯跟踪,返回当前函数名(function)、当前行号(line)、当前的文件名(file)、当前class的名称(class)、当前的object(object)、当前调用的类型(type:方法,静态,函数)、参数(args);使用$limit限制返回堆栈帧的数量
$options = [
    DEBUG_BACKTRACE_PROVIDE_OBJECT,	// 是否填充"object"的索引。
    DEBUG_BACKTRACE_IGNORE_ARGS,	// 是否忽略"args"的索引,包括所有的function/method的参数,能够节省内存开销。
];
debug_backtrace($option = DEBUG_BACKTRACE_PROVIDE_OBJECT, $limit = 0);

// 打印了一条PHP回溯,包括函数调用、被included/required的文件和eval()的代码
debug_print_backtrace();

// 获取最后一个发生的错误,错误为以"type"、"message"、"file"和"line"为数组键(内置函数还会有以函数名为键)的关联数组
error_get_last();

debug_backtrace示例

class A
{
    public function abc($a)
    {
        var_dump(debug_backtrace());
    }
}

class B
{
    public function abc()
    {
        (new A)->abc(1253);
    }
}


(new B)->abc();
/*
array(2) {
    [0] => // 当前方法的堆栈信息
    array(7) {
      'file' => string(36) "C:\Users\Administrator\Desktop\1.php"
      'line' => int(84)
      'function' => string(3) "abc"
      'class' => string(1) "A"
      'object' => class A#2 (0) {} // 指定$option为DEBUG_BACKTRACE_IGNORE_ARGS时,不会显示
      'type' => string(2) "->"
      'args' => // 指定$option为DEBUG_BACKTRACE_IGNORE_ARGS时,不会显示
        array(1) {
            [0] =>
            int(1253)
        }
    }
    [1] => // 调用者的堆栈信息
    array(7) {
      'file' => string(36) "C:\Users\Administrator\Desktop\1.php"
      'line' => int(89)
      'function' => string(3) "abc"
      'class' => string(1) "B"
      'object' => class B#1 (0) {}
      'type' => string(2) "->"
      'args' =>
        array(0) {
        }
    }
}*/

debug_print_backtrace示例

class A
{
    public function abc($a)
    {
        debug_print_backtrace();
    }
}

class B
{
    public function abc()
    {
        (new A)->abc(1253);
    }
}

/*
#0  A->abc(1253) called at [C:\Users\Administrator\Desktop\1.php:84]
#1  B->abc() called at [C:\Users\Administrator\Desktop\1.php:89]
*/

 

{/if}