как добиться функциональности #def c в PHP - PullRequest
0 голосов
/ 10 июня 2010

Ну, я не знаю, хочу ли я этого. Но вот моя проблема:

В случае какой-либо ошибки я регистрирую ФАЙЛ, КЛАСС, ФУНКЦИЮ и ЛИНИЮ в файле. Для этого я делаю что-то вроде:

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

Проблема везде, где я должен повторить этот код в параметре. и если я хочу изменить формат, я должен измениться везде.

Как я могу получить что-то вроде:

myLog(LOG_MSG_FORMAT);

С помощью PHP определить это невозможно, поскольку он даст мне номер LINE того места, где находится это определение, а не там, где определение используется.

Любое решение этой проблемы приветствуется. Я не стесняюсь иметь C как функциональность # def.

EDIT: Функция не обязательно вызывается только в случае ошибок. Просто я хочу записывать файл, строку и т. Д. Везде, где я вызываю эту функцию. Поэтому, если я просто вставлю код куда-нибудь "", он должен записать строку и т. Д.

Например:

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

Ответы [ 3 ]

2 голосов
/ 10 июня 2010
1 голос
/ 10 июня 2010

В PHP нет препроцессора, подобного C. Но вы можете использовать свой собственный обработчик ошибок и использовать уже упомянутый debug_backtrace, чтобы получить необходимую информацию.

0 голосов
/ 10 июня 2010

как говорили другие, вы можете использовать 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());
...