【问题标题】:php - turn-on/off-able function to print debugging messagesphp - 打开/关闭功能以打印调试消息
【发布时间】:2012-05-01 12:09:41
【问题描述】:

我对编程很陌生,当我开发我的程序时,我使用一个简单的策略来调试它:我编写程序以在运行重要语句时打印调试消息,例如

function foo1($number)
{
  //foo_print("I am function foo1({$number}). <br/>");
  //foo_print("I am going to increase 'count' by {$number}. <br/>");

  $GLOBALS["count"] = $GLOBALS["count'] + $number;

  //foo_print("Now 'count' = {$GLOBALS["count"]}, I finished my task, BYE BYE. <br/>");

}

function isFoo($number)
{
  //foo_print("I am function isFoo({$number}). <br/>");
  //foo_print("I am checking if the number < 3 or not, if so, it is Foo, if not, it is not Foo. <br/>");
  if($number <= 3)
  {
    //foo_print("Found that number = {$number} <= 3, I return true, BYE BYE. <br/>");
    return true;
  }

  //foo_print("Found that number = {$number} > 3, I return false, BYE BYE. <br/>");
  return false;
}

我称它们为调试消息,但如您所见,它们实际上是描述程序在每一行上做什么的彻底的 cmets。我只是编写函数 foo_print() 在调试程序时将它们打印出来。并在实际使用时将它们注释掉。

在实际运行模式和调试模式之间切换时,我没有逐行插入和删除注释符号'//',而是使用函数foo_print来完成工作:它可以设置为打开或关闭.

define(FOO_PRINT, 1)
function foo_print($message)
{
  if(FOO_PRINT) print $message;
  // if FOO_PRINT == 0 then do nothing.
}

但是我觉得这个方法无效,每次打印消息前都要检查FOO_PRINT。

我的问题是以下一个或两个

  • 当我不想使用 foo_print() 函数时,我可以做些什么来告诉 php 忽略它吗?

  • 1234563我可以这样做吗?

我认为,除了调试方便之外,这种方法的好处是可以帮助我在以后回来看程序时理解程序。 (对我来说很长很复杂,我相信我很快就会忘记它。)

我发现现在使用高级 IDE 和调试工具来开发我的程序对我来说非常复杂。我相信这些高级调试工具中的一些可以做与我想要的类似的事情,但我已经在 PHP-eclipse 和 xdebug 上尝试了一周,但它让我无处可去。非常感谢。

【问题讨论】:

    标签: php debugging function printing comments


    【解决方案1】:

    您可以定义两个函数,一个输出调试数据,另一个不输出。然后使用变量名来包含您要调用的函数的名称,并通过调用变量中的函数来进行调试。像这样:

    function debug_print($data) {
        echo $data;
    }
    function debug_none($data) {
    }
    
    $debug = 'debug_print';
    $debug('Testing one'); // This prints out 'Testing one'
    
    $debug = 'debug_none';
    $debug('Testing two'); // This doesn't print out anything
    

    如果你这样做,不要忘记将global $debug添加到任何想要使用该函数的函数中。

    编辑:还有一种更面向对象的方式来实现相同的结果。您可以定义一个接口并为其编写几个实现,允许您选择在运行时使用哪一个。

    $debugmode = true;
    
    interface Debugger {
        public function out($data);
    }
    
    class EchoDebugger implements Debugger {
        public function out($data) {
            echo $data;
        }
    }
    
    class NullDebugger implements Debugger {
        public function out($data) {
            // Do nothing
        }
    }
    
    if($debugmode)
        $debugger = new EchoDebugger();
    else
        $debugger = new NullDebugger();
    
    $debugger->out('This will be output if $debugmode is true');
    

    【讨论】:

    • 非常感谢,我无法想象 php 甚至可以做到这一点。顺便说一句,我希望有一种方法可以使它在严格的类型语言(如 c 或 java)中使用。 ^^
    • puppyxo:你可以在接口的帮助下——这在 PHP 中也是一种更好的方式。
    • 这很整洁。再次感谢你,我会确保尽可能给你投票。
    【解决方案2】:

    没有芽,

    不可能有这样的事情,你必须每次都定义一个条件。

    这不能在 php 的代码中完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2013-10-18
      • 1970-01-01
      • 2019-11-23
      • 2021-12-22
      • 2023-03-23
      相关资源
      最近更新 更多