/** * 逻辑断言,不受系统断言状态影响,可以用于生产环境的简单判断,比如:参数非法,参数缺失等 * @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 ""; } } }