日期:2014-05-17  浏览次数:20408 次

私人调试函数求优化
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 . v