Вопрос

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

В случае некоторой ошибки я регистрирую файл, класс, функцию и строку в файле. Для этого я делаю что-то вроде:

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

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

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

myLog(LOG_MSG_FORMAT);

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

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

РЕДАКТИРОВАТЬ:Функция не обязательно вызывается только в случае ошибок. Только я хочу войти в систему файла, строку и т. Д. Везде, где я звоню эту функцию. Так что, если я просто вставю код где-нибудь «», он должен регистрировать линию и т. Д.

Например:

<?php
...
...
<log this location>
...
...
<log this location>
Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top