', $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);
}
/**
* 尝试从array中取出一个命名变量, Ps.可以取消5.3中的Notice
* @param arry $arr
* @param string $strFieldName
* @return mixed
*/
static private function arr_get($arr, $strFieldName) {
if (isset($arr[$strFieldName])) {
return $arr[$strFieldName];
}
return null;
}
/**
* 获得调用堆栈
* @param int $levelnum 想要获得的调用层次,default is 3
* @return string formated string
*/
static public function get_call_stack($levelnum = 3) {
$array = debug_backtrace();
$outHtml = PHP_EOL;
array_shift($array); # 移除get_call_stack函数自身
$n = 1;
foreach ($array as $row) {
$outHtml .= "\t" . CommUtil::str2UTF8(self::arr_get($row, 'file')) # windows下路径(gb2312)转码
. ', row: ' . self::arr_get($row, 'line') . ', method: ' # line
. self::arr_get($row, 'function') . ";
" . PHP_EOL; # func
if ($levelnum <= $n++) {
break;
}
}
return $outHtml;
}
/**
* 浏览器弹窗提示
* @param string $msg
*/
public static function alert($msg) {
if (self::isDebugging()) {
echo "";
}
}
/**
* 检查模块是否加载
* @param string[] $arr 要检查的模块名称
*/
public static function checkModules($arr = array()) {
$default = array(# # 基础模块
"curl",
"mbstring",
"openssl",
"pdo_mysql",
"sockets",
"zlib",
);
$r_modules = array_merge($default, $arr); # 合并指定模块
$diff = array_diff($r_modules, get_loaded_extensions()); # 判断缺失模块
if (count($diff)) { # 确实缺失模块
die("require modules: " . implode(' ,', $diff)); # 直接结束运行
}
return true; # 返回true
}
/**
* 检查PHP版本
* @param string $ver 最低版本字符串类似于7.3.5
*/
public static function checkkPHPVersion($ver) {
$default_ver = "5.4.16";
$r_ver = isset($ver) ? $ver : $default_ver;
if (version_compare(PHP_VERSION, $r_ver, '<')) {
die('This code request at least PHP version ' . $r_ver #
. ', Current version: ' . PHP_VERSION . ".
" . PHP_EOL);
}
}
}