2009-09-02 47 views
1

澄清:如何獲取傳入當前對象的對象的類名或文件名?

我建立一個記錄器類,可以讓我輕鬆地記錄消息:

lib.Logger.php:

<?php 
class Logger { 
    private $handle; 

    public function __construct($log_name, $log_path) { 

     if (! is_dir($log_path)) 
      throw new Exception('Log path does not exist.'); 

     if (! in_array(strtolower(substr($log_name, 0, -4)), array('.log', '.txt'))) 
      $log_name = "{$log_name}.log"; 

     $this->handle = fopen("{$log_path}/{$log_name}", 'a'); 

     $this->log('------------- Initializing ------------- '.get_parent_class($this)); 
    } 

    // -------------------------------------------------------------------- 

    public function __destruct() { 
     fclose($this->handle); 
    } 

    // -------------------------------------------------------------------- 

    public function log($message) { 
     $time = date(DATE_RFC822); 

     $log = "[{$time}] {$message}\n"; 

     fwrite($this->handle, $log); 
    }  

} 

?> 

而且我把這種使用:

MyController.php:

<?php 
class MyController extends Controller { 
    $logger = new Logger('testlog','/path/to/logs/'); 
    $logger->log('Logs are fun!'); 
} 
?> 

當我在itialize對象:

$this->log('------------- Initializing ------------- '.get_parent_class($this)); 

我要記錄的對象(或文件)的名稱與調用日誌() - 在這種情況下,無論是

MyController
/path/to/MyController.php

我試過使用get_parent_class(),但當然這不起作用,因爲記錄器本身沒有父類。

任何想法?十分感謝你的幫助!

亞歷克斯·B

回答

1

隱式處理這個問題的唯一方法是從其他人建議的debug_backtrace捕獲輸出。

如果你有興趣在一個明確的辦法,也許這可能是它在記錄儀

public function initialize($context) 
{ 
    $logMessage = '------------- Initializing ------------- '; 
    if (is_object($context)) 
    { 
    $logMessage .= get_class($context); 
    } else { 
    // do something else? 
    } 
    $this->log($logMessage); 
} 

然後

class MyController extends Controller 
{ 
    public function someFunc() 
    { 
    $logger = new Logger('testlog','/path/to/logs/'); 
    $logger->initialize($this); 
    $logger->log('Logs are fun!'); 
    } 
} 
2

您預訂購需要利用功能debug_backtrace()的。但是請注意,該函數的返回值並不是非常一致(即使它應該是 - 每個數組鍵都不存在,例如,表明該文件是未知的(eval'd code )或者與之前的堆棧幀相同)。這是所謂的這個人應該在索引0可用之前的最後一個函數:

$trace = debug_backtrace(); 
$calling_function = $trace[0]['function']; 
3

我想一個解決方案是使用debug_backtrace

給出的示例獲取這樣的回溯:

array(2) { 
[0]=> 
array(4) { 
    ["file"] => string(10) "/tmp/a.php" 
    ["line"] => int(10) 
    ["function"] => string(6) "a_test" 
    ["args"]=> 
    array(1) { 
     [0] => &string(6) "friend" 
    } 
} 
[1]=> 
array(4) { 
    ["file"] => string(10) "/tmp/b.php" 
    ["line"] => int(2) 
    ["args"] => 
    array(1) { 
     [0] => string(10) "/tmp/a.php" 
    } 
    ["function"] => string(12) "include_once" 
    } 
} 

所以,應該包括你想;-)


不過,這似乎是最好的,在我看來,解決方案是什麼,會可以通過調用日誌方法所需的信息...
(只是感覺更多...自然^^但這不是一個非常理性的意見,我想^^)

0

我碰到了(幾乎)最後這個確切的問題晚。我正在使用debug_backtrace()(正如許多人已經提到的)來解決它。我需要知道包含調用某個函數的控制器的模塊。由於我的控制器在類名稱中包含模塊名稱,因此我只需從debug_backtrace()中獲取返回值,然後explode()將其取回以獲取模塊名稱。

Soulmerge對於並不總是一致的回報做出了很好的評價,但是如果您以某種方式構建您的代碼,您肯定能夠獲得足夠準確的回報。