/**
* 逻辑断言,不受系统断言状态影响,可以用于生产环境的简单判断,比如:参数非法,参数缺失等
* @param bool $condition
* @param int/string $err 如果是int值,则当作Errcode处理,否则当作字符串处理
*/
static function assert($condition, $err) {
if (!$condition) { # 断言失败
if (is_int($err)) { # err是int值,则按照错误码查找错误提示信息
$msg = "";
$errMsg = GameConfig::errmsg_getItem($err);
if (isset($errMsg)) {
$msg = $errMsg->msg;
}
CLog::err("断言失败!", $msg);
Err($err, $msg);
} else { # 不是int值,则当做普通错误信息来处理
CLog::err("断言失败!", $err);
Err(ErrCode::msg_assert, $err);
}
}
}
/**
* 接管系统的断言失败处理函数(调试用,若要检查参数是否完整,请用Resp::assert())
* 注意:方法内部依赖于GAME_ONLINE标志,若为内网调试则打开断言,
* 若为线上环境则关闭断言(提升安全性和部分性能)
*/
static function cover_assert_handler() {
assert_options(ASSERT_ACTIVE, true); # 设置断言标志
assert_options(ASSERT_BAIL, true);
assert_options(ASSERT_WARNING, false);
assert_options(ASSERT_CALLBACK, array('DebugHelper', 'my_assert_handler')); # 设置回调函数
}
/**
* 断言处理函数
* @param string $file
* @param int $line
* @param string $code
* @param string $desc
*/
private static function my_assert_handler($file, $line, $code, $desc) {
$msg = "
Assertion Failed:
File '$file'
Line '$line'
Code '$code'
Desc '{$desc}'
";
Err(Err::err_assert, $msg); # 给客户端返回值
// trigger_error($msg, E_USER_ERROR); # 抛出一个err
}
//
//
/**
* 浏览器打印调试信息
* @param mixed $msg 对象或数组将会被序列化为json串
*/
public static function debug($msg) {
if (self::isDebugging()) {
if (is_array($msg) || is_object($msg)) {
$msg = json_encode($msg);
}
echoLine('[' . TimeUtil::dtCurrent() . ']| ' . $msg);
}
}
/**
* var_dump输出变量,统一入口的话, 上线的时候通过统一变量关闭,防止漏删除的意外输出.
* @param mixed $obj
*/
public static function var_dump($obj) {
if (!self::isDebugging()) {
return;
}
$pos = self::get_call_stack();
$stack = explode('
', $pos);
$n = 3 > count($stack) ? count($stack) : 3;
for ($i = 0; $i < $n; $i++) {
echoLine($stack[$i]);
}
echoLine(); # 换个行
var_dump($obj);
}
/**
* 浏览器输出调用堆栈
* @return void
*/
public static function print_stack_trace() {
/* * * * *
* 因为debug_print_backtrace()格式不太易读,自己调整下输出样式
* * * */
$html = self::get_call_stack();
self::debug($html);
}
/**
* 获得调用堆栈
* @param int $nestedLevelNum 调用的嵌套层次,default is 1
* @return string formated string
*/
static public function get_call_stack($nestedLevelNum = 1, $n = 3, $printArg = false) {
$outHtml = "";
$arr = debug_backtrace();
// var_dump($arr);
$array = array_slice($arr, $nestedLevelNum, $n); # 移除get_call_stack函数自身
// var_dump($array);
foreach ($array as $row) {
$outHtml .= "\t" . CommUtil::str2UTF8(self::arr_get($row, 'file')) . # windows下路径(gb2312)转码
' method: ' . self::arr_get($row, 'class') . self::arr_get($row, 'type') . self::arr_get($row, 'function') # func
. '(' . ($printArg ? JsonUtil::encode(self::arr_get($row, 'args')) : "") . ')' # 参数
. ', row: ' . self::arr_get($row, 'line') # line
. ";
" . PHP_EOL;
}
return $outHtml;
}
/**
* 浏览器弹窗提示
* @param string $msg
*/
public static function alert($msg) {
if (self::isDebugging()) {
echo "";
}
}
}