对于我目前的项目,我构建了一个类,允许我将信息与当前堆栈跟踪一起记录。我使用debug_backtrace()
来获取回溯,但是有一个" not a bug"在每次调用继承的静态方法时,backtrace都会提到父类的名称,而不是实际的名为class的名称。
如果你举这个例子:
<?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
(
)
)
)
你知道,我从这个回溯中得知的是Animal::create()
已被执行,但我不知道它是Dog
还是Cat
,而我&# 39;我不得不查看代码来查找 - 当我查看多行日志时这不太理想!
有没有办法像debug_backtrace()
那样建立堆栈跟踪,但是使用调用类名?
注意:我正在运行PHP 5.5
答案 0 :(得分:0)
也许您可以尝试不进行静态调用,如果需要,您可以使用服务容器为您完成所有脏工作。 服务容器不仅可以使您正确获取跟踪,而且还可以使您的代码可以测试!
class Logger {
public function trace() {
print_r(debug_backtrace());
}
}
class Animal {
public function create() {
$logger = new Logger();
$logger->trace();
}
}
class Cat extends Animal {
}
class Dog extends Animal {
}
$cat = new Cat();
$cat->create();
没有静态电话,它让我知道:
Array
(
[0] => Array
(
[file] => /home/daniel/workspace/playground/stack.php
[line] => 11
[function] => trace
[class] => Logger
[object] => Logger Object
(
)
[type] => ->
[args] => Array
(
)
)
[1] => Array
(
[file] => /home/daniel/workspace/playground/stack.php
[line] => 22
[function] => create
[class] => Animal
[object] => Cat Object
(
)
[type] => ->
[args] => Array
(
)
)
)
希望这有帮助!