簡體   English   中英

由register_tick_function()調用的PHP debug_backtrace()不會返回完整堆棧

[英]PHP debug_backtrace() called by register_tick_function() does not return the full stack

我想使用register_tick_function()掛鈎以下調用並使用debug_backtrace()打印它們的堆棧跟蹤。

如果我運行以下代碼。

<?php

function dump() {
  // Replace this with var_dump(debug_backtrace()); to print the entire trace.
  foreach (debug_backtrace() as $trace)
    echo("Function ${trace['function']}() has been called" . PHP_EOL);
}

declare(ticks = 1);
register_tick_function('dump');

print("");
array_search('green', Array());

它只打印dump()函數。

Function dump() has been called
Function dump() has been called
Function dump() has been called

為什么我沒有看到print()array_search()跟蹤數據? 就像堆棧在調用dump()之前已經重置一樣。 我也很確定它過去是否正常運行。

你誤解了回溯是什么,這個堆棧不是PHP在到達某一行代碼之前執行的函數列表,而是嵌套函數列表,證明PHP的解釋器在特定的代碼行。

第一個元素將始終是您當前所在的函數,下一個元素將是調用該函數的函數,依此類推。 如果函數返回,則它不再在堆棧中。

class Foo {
    public static function bar() {
        return self::say();
    }

    public static function say() {
        return debug_backtrace();
    }
}

var_dump(Foo::say());
//[0] => say()

var_dump(Foo::bar());
//[0] => say();
//[1] => bar();

//Note that this behaviour work the same for require(), include() and eval()

require_once('test.php');

//test.php:
var_dump(debug_backtrace());
//[0] => require_once()

當PHP解釋您的腳本時,它會導航您的函數,添加和刪除當前堆棧。 回溯的堆棧不是PHP記錄按時間順序調用哪些函數的地方。

對於后者,這是我找到的解決方案: 在PHP中獲取一個被調用的函數列表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM