【问题标题】:how to achieve functionality of #def of c in PHP如何在PHP中实现c的#def的功能
【发布时间】:2010-06-10 07:26:46
【问题描述】:

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

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

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

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

我怎么能有类似的东西:

myLog(LOG_MSG_FORMAT);

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

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

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

例如:

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

【问题讨论】:

  • 您没有添加任何新内容。答案一样
  • 感谢您的回答。尽管它们中的大多数都是可以接受的答案。我将stereofrog的完整性标记为“已接受”。

标签: php logging error-logging


【解决方案1】:

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 2011-05-09
        相关资源
        最近更新 更多