读书人

私家调试函数求优化

发布时间: 2013-01-17 10:28:54 作者: rapoo

私人调试函数求优化
1.可能有点异想天开,我希望获取调用这个函数的文件的文件名和行数,目前的死办法是外面传__FILE__和__LINE__

2.我想获取外面传的调试变量的名称,例如你有个变量叫 $abc = 'fdsafs'; 这样赋值了,然后 debug($abc); 我能在这个函数内部想办法知道这个变量的名称叫 abc

3.获取变量类型,类似别的语言的typeof,现在来一个变量,假设它是字符串,却没办法echo typeof($data) ,却要if(is_string($data))echo 'string';...

4.你能提出的更多优化建议,写一写你的改造结果~


====================
这个函数从当初最简单的
function debug($data, $die = false){
echo '<pre>';
print_r($data);
echo '</pre>';
if($die)die();
}
到今天如下面的代码,已经是一年多了~方便自己调试变量值.我也懒得学那些什么复杂的调试框架什么xDebug..其实我要调试的需求在上面说的和下面代码体现的都有了,没更多的要求.
大家有没有试过,在一个很大的程序体里,到处echo一些值,在调试完后修正代码后,运行时还发现有调试的echo值输出,却不记得这个echo放哪里了- - 所以我需要知道这个调用的文件位置和行号.包括其它更多的调试需求,其实也不是很多,知道变量内容,长度,类型,它变成这个内容的文件位置就行了.



上代码:

<?php
$a = 'xx';
$b = 45;
$c = true;
$d = false;
$e = null;
$f = new stdClass();
$g = array(
'a' => 'v1',
'b' => 'v2',
);


debug($a);
debug($b);
debug($c);
debug($d);
debug($d);
debug($e);
debug($f);
debug($g);


function debug($data, $die = false, $file = null, $line = null){
static $debugCount = 0; //调试计数器
echo '<br />================= 新的调试点: <b style="color:red;">'.++$debugCount.'</b>========================<br />';
if($file)echo "文件名: $file<br />\n";
if($line)echo "行数: $line<br />\n";
$len = strlen($data);
if($len)echo '内容长度:'.$len."<br />\n";
echo "变量名称: a<br />\n"; //有没有办法获取到外面传参时,debug($a);的变量名称 'a'?
echo "<pre>\n";
print_r(var_export($data, true));
echo "</pre>\n";


if($die){
exit('<br /><a href="##" onclick="javascript:history.go(-1)">返回</a>');
}
else return $debugCount;
}
[解决办法]

function debug()
{
global $config;
if(!$config['debug']) {
return;
}

echo '<pre>';
foreach(func_get_args() as $var)
var_dump($var);
echo '</pre>';
}
function fdebug()
{
global $config;
if(!$config['debug']) {
return;
}
foreach(func_get_args() as $var) {
file_put_contents('./aaa_yii_debug.php', '<?php' . PHP_EOL . var_export($var, true) . PHP_EOL.'?>'.PHP_EOL . PHP_EOL, FILE_APPEND);


}
}
function myfdebug()
{
$var = func_get_args();
if(is_string($var[0])) {
for($i=1; $i<count($var); $i++) {
file_put_contents('./aaa_' .$var[0]. '.php', '<?php' . PHP_EOL . var_export($var[$i], true) . PHP_EOL.'?>'.PHP_EOL . PHP_EOL, FILE_APPEND);
}
}
else {
call_user_func_array('fdebug', $var);
}
}
//个人用的


[解决办法]
借助异常的跟踪机制:
function dump(){
try{
throw new Exception();
}catch(Exception $e){
$trace = $e->getTrace();
array_shift($trace);
return $trace;
}
}

读书人网 >PHP

热点推荐