如何在PHP中实现c的#def功能

时间:2010-06-10 07:26:46

标签: php logging error-logging

好吧,我不知道那是不是我想要的。但这是我的问题:

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

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

问题无处不在我要在参数中重复该代码。如果我想改变格式,我会在任何地方改变。

我怎么能有类似的东西:

myLog(LOG_MSG_FORMAT);

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

欢迎任何解决方案。我对于具有#def的C语言功能并不感到愚蠢。

修改 仅在出错时才会调用该函数。只是我想在我调用该函数的任何地方记录文件,行等。 因此,如果我只是将代码粘贴到某个地方,那么它应该记录行等等。

例如:

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

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

PHP没有像C这样的预处理器。但你可以use your own error handler并使用已经提到的debug_backtrace来获取所需的信息。

答案 2 :(得分: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());