2010-06-10 10 views
-1

글쎄, 내가 원하는 것일 지 모르겠다. 그러나 여기에 내 문제가 있습니다 :PHP에서 #def of C#의 기능을 구현하는 방법

어떤 오류가 발생하면 파일, 클래스, 기능 및 줄을 파일에 기록하고 있습니다. 이를 위해 다음과 같은 작업을 수행합니다.

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

문제는 어디에서나 매개 변수에서 해당 코드를 반복해야합니다. 형식을 변경하려면 모든 곳을 변경해야합니다. PHP와

myLog(LOG_MSG_FORMAT); 

이 장소의 내 줄 번호를 부여하기 때문에 그 정의는 어디에서 할 수없는 정의가 아니라 정의가 어디 익숙해된다

어떻게 내가 좋아하는 뭔가를 할 수 있습니다.

모든 해결책을 환영합니다. 나는 #def의 기능과 같은 C를 갖는 것에 대해 불평하지 않습니다.

편집 : 오류가 발생한 경우에만 기능을 호출 할 필요는 없습니다. 그 기능을 호출 할 때마다 파일, 라인 등을 기록하고 싶습니다. 난 그냥 ""어딘가에 코드를 붙여 넣으면 그래서, 등 라인, 예를 들어

로그인해야합니다 :

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

새로운 기능이 추가되었습니다. 대답은 동일합니다 –

+0

답변 주셔서 감사합니다. 대부분은 수용 가능한 대답이지만 나는 스테레오 개구리의 완전 함을 "받아 들였"다고 표시하고 있습니다. – Sabya

답변

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()); 
관련 문제