2010-06-10 66 views
-1

那麼,我不知道這是否是我想要的。但這裏是我的問題:如何在PHP中實現c的#def功能

如果出現一些錯誤,我將FILE,CLASS,FUNCTION和LINE記錄到一個文件中。爲此我做的是這樣的:

myLog('['. __FILE__ . ']' . '[' . __CLASS__ . ']' . '[' . __FUNCTION__ . ']' . '[' . __LINE__ . ']'); 

問題無處不在我要重複參數中的代碼。如果我想改變格式,我必須改變。

我怎麼能有這樣的:

myLog(LOG_MSG_FORMAT); 

使用PHP定義它是不可能的,因爲它會給我的地方行號該定義是,不要在那裏已經習慣的定義。

任何解決方案,這是值得歡迎的。我不喜歡擁有像C#一樣的功能#def。

編輯: 該函數不一定只在錯誤的情況下被調用。只是我想記錄文件,線路等,無論我在哪裏調用該函數。 所以,如果我只是粘貼代碼的地方「」,它會記錄這個線等

例如:

<?php 
... 
... 
<log this location> 
... 
... 
<log this location> 
+0

您已添加新內容。答案相同 – 2010-06-10 09:15:09

+0

感謝您的答案。儘管其中大部分都是可接受的答案。我認爲stereofrog的完整性被「接受」。 – Sabya 2010-06-12 11:50:50

回答

0

正如別人所說,你可以使用debug_backtrace來查找你的日誌函數的調用位置。 debug_backtrace頗不一致,因此有一些涉及權謀,這裏有一個例子:

// helper 
function e($a, $k, $d = null) { 
    return isset($a[$k]) ? $a[$k] : $d; 
} 

function mylog($msg) { 
    $t0 = e(debug_backtrace(), 0); 
    $t1 = e(debug_backtrace(), 1); 

    $header = sprintf("%s:%s (%s:%s)", 
     e($t1, 'class', 'global'), 
     e($t1, 'function', 'unknown'), 
     e($t0, 'file'), 
     e($t0, 'line')); 

    $_ = func_get_args(); 
    $s = $header . ': ' . vsprintf(array_shift($_), $_); 

    echo $s, "\n"; // or error_log 
} 

作爲一個自由的獎金,my_log也接受printf類型,例如參數列表

my_log("send mail to=%s subject=%s time=%d", $to, $subject, time());