在堆栈跟踪中获取被调用的静态类名称

时间:2014-03-24 16:08:25

标签: php

对于我目前的项目,我构建了一个类,允许我将信息与当前堆栈跟踪一起记录。我使用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

1 个答案:

答案 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
                (
                )

        )

)

希望这有帮助!