-1

嗯,我不知道这是否是我想要的。但这是我的问题:

如果出现一些错误,我会将 FILE、CLASS、FUNCTION 和 LINE 记录在一个文件中。为此,我正在做类似的事情:

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

问题无处不在,我必须在参数中重复该代码。如果我想改变格式,我必须到处改变。

我怎么能有类似的东西:

myLog(LOG_MSG_FORMAT);

使用 PHP 定义是不可能的,因为它会给我该定义所在位置的 LINE 编号,而不是使用该定义的位置。

欢迎对此的任何解决方案。对于#def 的类似 C 的功能,我并不讨厌。

编辑: 该函数不一定只在出现错误的情况下才被调用。只是我想在调用该函数的任何地方记录文件、行等。因此,如果我只是将代码粘贴到某处“”,它应该记录该行等。

例如:

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

3 回答 3

2

调试回溯()

于 2010-06-10T07:28:47.447 回答
1

PHP 没有像 C 那样的预处理器。但是您可以使用自己的错误处理程序并使用其中已经提到debug_backtrace的来获取所需的信息。

于 2010-06-10T08:12:07.797 回答
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());
于 2010-06-10T09:35:13.900 回答