2014-03-24 58 views
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 
       (
       ) 

     ) 

) 

你看,都是我從這個回溯知道的是,被處決,但我不知道它是否是DogCat,我不得不在代碼中查找它 - 當我在查看多行日誌時,這不太理想!

有沒有辦法建立一個堆棧跟蹤好像debug_backtrace()的,但調用類名而不是?

注:我運行PHP 5.5

+0

如果可能,我可以建議使用「類名=文件名」的方法。在這種情況下,您將始終擁有文件路徑並可以從中獲取類名(Dog.php => Dog,Cat.php => Cat)。 –

+0

@AndreyMischenko:我確實遵循這種方法,但在很多情況下,這並沒有幫助,因爲子類覆蓋了屬性而不是方法,因此它們不會出現在調用堆棧中(實際上對於我的許多應用程序模型,從Model繼承而來,並不一定聲明方法,只有像表名等屬性......所以我在SomeController.php中得到了'Model :: find()',然後'Query-> execute( )'在Model.php中,然後在Query.php中使用'PDOStatement-> execute()') –

回答

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

     ) 

) 

希望這有助於!