![](/img/trans.png)
[英]How to get called function name in __construct without 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.