Php 如何有条件地禁用代码
我是一名C/C++程序员,不熟悉PHP。 在C/C++中,我经常将代码添加到我的项目中(例如调试输出),这些代码只有在定义了特定宏时才会激活。因此,我可以通过在中心头文件中定义/删除宏定义来“打开/关闭”一些代码 例如,在头文件中:Php 如何有条件地禁用代码,php,macros,Php,Macros,我是一名C/C++程序员,不熟悉PHP。 在C/C++中,我经常将代码添加到我的项目中(例如调试输出),这些代码只有在定义了特定宏时才会激活。因此,我可以通过在中心头文件中定义/删除宏定义来“打开/关闭”一些代码 例如,在头文件中: #define ENABLE_DEBUG_OUTPUT 以及代码中有用的任何地方: #ifdef ENABLE_DEBUG_OUTPUT print_debug_output ( ... ); #endif 因此,要禁用print-debug_输出调用(
#define ENABLE_DEBUG_OUTPUT
以及代码中有用的任何地方:
#ifdef ENABLE_DEBUG_OUTPUT
print_debug_output ( ... );
#endif
因此,要禁用print-debug_输出调用(或其他任何调用),我只需要注释掉头文件中的#define
PHP中是否有一些等价物
首先,我想在测试系统上使用FireHP调试输出,但在将代码放到服务器上后立即禁用它。最好的方法是什么?通常您会使用最基本的方法:
$debug = SOME_CONDITIONAL;
if ($debug) {
// display errors/warnings/notices in output
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
}
然后,正如主代码中所预期的那样:
if ($debug) {
/* debugging code */
}
我知道这很糟糕,但很好,很清楚。一种可能的方法是将这样的变量放在全局变量中:
$GLOBALS['ENABLE_DEBUG_OUTPUT'] = true;
然后
if (isset($GLOBALS['ENABLE_DEBUG_OUTPUT'])){
echo ...
}
您可以使用本机PHP函数
使用全局调试函数,如:
// $level = 0 nothing - 9 alert with email
function debug($str, $level = 1) {
// Uncomment the following line in NO_DEBUG mode:
//return;
switch ($level) {
case 9:
//mail();
case 8:
case 7:
case 5:
// file_put_contents(); // or whatever
case 3:
echo $str, PHP_EOL;
case 2:
case 1:
case 0: break;
}
}
你可以把它放在不同的级别,比如说,如果它的9级,它会发送一封邮件,写一个日志,然后回显到屏幕上。在5级,你只需要写一个日志并打印到屏幕上(这就是为什么我不会在每一个案例上都打断你)
使用像taht这样的函数,您不必包装
if (defined('ENABLE_DEBUG')) {
//...
}
环绕每个调试消息,但只需使用
debug('teststring')代码>您也可以在php中使用常量:
<?php
define('DEBUG', true);
';
}
}
我个人使用一个函数
debug($obj,$label)
,该函数将此信息发送到FireHP
以在firebug控制台中获得调试信息最简单的方法是定义一个常量,例如debug\u ENABLED
,然后使用if(debug\u ENABLED)
来测试是否记录;如果这能让事情变得更简单,那么可以在配置文件中定义DEBUG_ENABLED,在ini文件中设置一个变量,并在使用FireHP进行调试的任何地方检查它的开或关。最好将该开关放在与print_DEBUG_输出函数(在问题的示例中)等效的函数中,而不是乱扔if(调试)
语句贯穿整个代码库。始终提醒echo$var;var_dump($var);这总是有用的(即使有人会对我大喊大叫)。Mark所说的确实是最有效/最简单的。如果您需要更复杂的内容,请查看异常。此外,由于答案并不完全正确,debug应该始终是常量而不是变量。
<?php
define('DEBUG', true);
<?php
function debug($obj)
{
if (DEBUG)
{
echo '<pre>';
var_dump($obj);
echo '</pre>';
}
}