/**
* 返回函数操作链表
*
* @param int $level
* 返回多少级
* @param int $start
* 跳过原来多少级
* @param boolean $gettree
* 是否按树的形式返回
* @return array
*/
function backtracelist($level = 3, $start = 0, $gettree = false) {
$backtrace = debug_backtrace ();
$btlist = array ();
if ($backtrace) {
$level = $level + $start;
foreach ( $backtrace as $i => $bt ) {
if ($i < $start) {
continue;
}
if ($i >= $level) {
break;
}
$args = '';
foreach ( $bt ['args'] as $a ) {
if (! empty ( $args )) {
$args .= ', ';
}
switch (gettype ( $a )) {
case 'integer' :
case 'double' :
$args .= $a;
break;
case 'string' :
$a = htmlspecialchars ( substr ( $a, 0, 64 ) ) . ((strlen ( $a ) > 64) ? '...' : '');
$args .= ""$a"";
break;
case 'array' :
$args .= 'Array(' . count ( $a ) . ')';
break;
case 'object' :
$args .= 'Object(' . get_class ( $a ) . ')';
break;
case 'resource' :
$args .= 'Resource(' . strstr ( $a, '#' ) . ')';
break;
case 'boolean' :
$args .= $a ? 'True' : 'False';
break;
case 'NULL' :
$args .= 'Null';
break;
default :
$args .= 'Unknown';
}
}
$params = array (
"line" => $bt ['line'],
"file" => $bt ['file'],
"class" => $bt ['class'],
"type" => $bt ['type'],
"function" => $bt ['function'],
"args" => $args,
"next" => $params
);
$btitem = array (
'file' => "{$bt['line']} - {$bt['file']}",
'call' => "{$bt['class']}{$bt['type']}{$bt['function']}($args)"
);
if ($bt ['args']) {
$btitem ['args'] = $bt ['args'];
}
$btlist [] = $btitem;
}
}
if ($gettree) {
return $params;
}
return $btlist;
}
/**
* 通过在 $_GET[GDDEBUG_LEVEL]=1
* 可以动态调整 gddebug 时 backtracelist 打印出来的层数,方便数据调试
*/
defined ( 'GDDEBUG_LEVEL' ) or define ( 'GDDEBUG_LEVEL', 'GDDEBUG_LEVEL' );
/**
*
* @author caihaibin
* 数据打印工具,用来打印各种数据进行调试
* 字符串为 string(1) "a"
* 数字为 int(1)
* NULL 为 NULL
* 数组为 Array(
* 'a'=>'test'
* )
* 对像为 Object xxxx
*
* 另补充数据 debug_backtrace 层级调试,可以方便跟踪数据所在位置 ,具体看 backtracelist()
* 可以通过 $_GET [GDDEBUG_LEVEL] 指定对应显示层级
* 再将返回结果插入数据库,可以通过数据库进行数据调试
*/
function gddebug() {
echo "rn<pre>";
if (isset ( $_GET [GDDEBUG_LEVEL] )) {
$level = $_GET [GDDEBUG_LEVEL];
} else {
$level = 0;
}
$btlist = backtracelist ( $level, 1 );
if (! empty ( $btlist )) {
echo "backtracelist:rn";
foreach ( $btlist as &$btitem ) {
if (isset ( $btitem ['args'] ))
$btitem ['args'] = preg_replace ( '/n/ms', "n ", print_r ( $btitem ['args'], true ) );
}
echo htmlspecialchars ( print_r ( $btlist, true ) ) . "rn";
}
$arrays = func_get_args ();
echo "args:rn";
foreach ( $arrays as $value ) {
if (is_array ( $value ) || is_object ( $value )) {
echo htmlspecialchars ( print_r ( $value, true ) ) . "rn";
} elseif (is_string ( $value )) {
echo "string(" . strlen ( $value ) . ") "" . htmlspecialchars ( $value ) . ""rn";
} else {
var_dump ( $value );
}
}
echo "</pre>";
}