Как добиться функциональности #def C в PHP
-
26-09-2019 - |
Вопрос
Ну, я не знаю, если это то, что я хочу. Но вот моя проблема:
В случае некоторой ошибки я регистрирую файл, класс, функцию и строку в файле. Для этого я делаю что-то вроде:
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
в нем, чтобы получить необходимую информацию.