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

发布于 2024-09-05 01:15:27 字数 663 浏览 7 评论 0原文

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

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

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

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

我怎样才能有这样的东西:

myLog(LOG_MSG_FORMAT);

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

欢迎任何对此问题的解决方案。我并不讨厌拥有类似 C 语言的 #def 功能。

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

例如:

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

Well, I don't know if thats what I want. But here is my problem:

In case of some error I am logging the FILE, CLASS, FUNCTION and LINE in a file. For that I am doing something like:

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

The problem is everywhere I've to repeat that code in the parameter. and If I want to change the format, I've to change everywhere.

How can I have something like:

myLog(LOG_MSG_FORMAT);

With PHP define it is not possible since it will give my the LINE number of the place where that definition is, not where the definition is getting used.

Any solution to this is welcome. I am not bitchy about having C like functionality of #def.

EDIT:
The function does not necessarily be called only in case of errors. It is just that I want to log the the file, line, etc. wherever I am calling that function.
So if I just paste a code somewhere "", it should log the line, etc.

For example:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

木緿 2024-09-12 01:15:27

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

PHP has no preprocessor like C. But you could use your own error handler and use the already mentioned debug_backtrace in it to get the required information.

心碎的声音 2024-09-12 01:15:27

正如其他人所说,您可以使用 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());

as others said, you can use debug_backtrace to find out the calling location of your log function. debug_backtrace is quite inconsistent, therefore there is some trickery involved, here's an example:

// 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
}

As a free bonus, my_log also accepts a parameter list in printf style, e.g.

 my_log("send mail to=%s subject=%s time=%d", $to, $subject, time());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文