如何在“调试模式”中删除全局变量(全局变量恐慌)

时间:2011-06-15 21:03:23

标签: php debugging global-variables

我想知道如何为他们的应用程序创建一个调试室。

我的例子是我将可变内容输出到屏幕上,让我可以看到我的变量在整个过程中的作用。确保他们正在做他们应该做的事情。 (穷人的tdd?)

-------- NEW CODE --------------------

所以这就是我现在提出的,但它涉及一个!!全局变量!!

我的脚本的所有页面都包含一个公共文件。在那里我提出以下内容:

<?php //COMMON FILE
$debug_mode = 'on'; //my trigger

if( strtolower($debug_mode) == 'on'){
    $debug = "<hr /><pre>";
    if( file_exists('debug_mode.php') ){  //This file will never be used in a
        include('debug_mode.php');    //a production environment
    }
}

function debug($str, &$debug){
    if( function_exists('debugff') ){
        $str = debugff($str, $debug);
    }
    else{
        unset($debug);
    }
}
?>

<?php //DEBUG_MODE FILE NEVER USED IN PRODUCTION MODE
if( strtolower($debug_mode) == 'on'){ 
    function debugff($debugstring, &$debug){ 

        global $debug;

        if( is_null($debugstring) ){
            echo $debug . "</pre><hr />";
        }
        else{ 
            $debug .= $debugstring . "\n";
        }
    }
}

?> 

要使用该脚本,我使用调试函数。

debug(“username:$ user”,$ debug);

我可以做到这一百万次。当我想打印结果时,我只需要调用

debug(null,$ debug);

我听过无数次从不使用全局变量,这是我第一次实现它。按照我设置的方式设置意味着在“真实世界”中全局变量永远不会被调用,但是如何从这里获取全局变量。

2 个答案:

答案 0 :(得分:1)

尝试学习PHP框架。他们以OOP的方式更好地解决了这些问题。

无论如何,在你的例子中,你可以删除很多代码:

$debug_mode = TRUE;

function dump() {
  global $debug_mode;

  if ($debug_mode) {
    call_user_func_array('var_dump', func_get_args());
  }
}

然后,您可以使用dump($ var1,$ var2,$ var3)转储变量,并且不必担心此函数之外的生产模式。一旦您关闭调试模式,就不会显示转储。

答案 1 :(得分:0)

您可以只调用函数(每行一行),而不是使用全局变量。

然后创建一个构建脚本,该脚本正在编译(因为这是PHP读取:放在一起)生产代码。该构建脚本只删除包含这些调用的所有行。

构建脚本也不会复制函数的定义。

然后对构建的生产代码运行验收和集成测试。由于现在缺少调试函数的定义,因此 会在调用时触发致命错误。整合和验收测试会注意到这些致命的错误。但是因为所有的调用都被剥离了,测试应该没有任何问题。