2
對於我當前的項目,我構建了一個類,它允許我將信息與當前堆棧跟蹤一起記錄。我使用debug_backtrace()
來獲取回溯,但有一個「not a bug」,通過它,每當調用一個繼承的靜態方法時,回溯提到父類的名稱而不是實際的被調用類的名稱。在堆棧跟蹤中獲取被調用的靜態類名
如果拿這個例子:
<?php
class Logger {
public static function trace() {
print_r(debug_backtrace());
}
}
class Animal {
public static function create() {
Logger::trace();
}
}
class Cat extends Animal {
}
class Dog extends Animal {
}
Cat::create();
這是debug_backtrace()
產生的堆棧跟蹤:
Array
(
[0] => Array
(
[file] => /t.php
[line] => 10
[function] => trace
[class] => Logger
[type] => ::
[args] => Array
(
)
)
[1] => Array
(
[file] => /t.php
[line] => 20
[function] => create
[class] => Animal
[type] => ::
[args] => Array
(
)
)
)
你看,都是我從這個回溯知道的是,被處決,但我不知道它是否是Dog
或Cat
,我不得不在代碼中查找它 - 當我在查看多行日誌時,這不太理想!
有沒有辦法建立一個堆棧跟蹤好像debug_backtrace()
的,但調用類名而不是?
注:我運行PHP 5.5
如果可能,我可以建議使用「類名=文件名」的方法。在這種情況下,您將始終擁有文件路徑並可以從中獲取類名(Dog.php => Dog,Cat.php => Cat)。 –
@AndreyMischenko:我確實遵循這種方法,但在很多情況下,這並沒有幫助,因爲子類覆蓋了屬性而不是方法,因此它們不會出現在調用堆棧中(實際上對於我的許多應用程序模型,從Model繼承而來,並不一定聲明方法,只有像表名等屬性......所以我在SomeController.php中得到了'Model :: find()',然後'Query-> execute( )'在Model.php中,然後在Query.php中使用'PDOStatement-> execute()') –