PHP中一个更漂亮/信息丰富的Var_dump替代方案?

问题描述 投票:131回答:24

每个体面的PHP程序员都有一个print_rvar_dump包装他们使用,喜欢和分配快捷键,为什么我们不分享我们最喜欢的。

php debugging variables var-dump
24个回答
67
投票

在问了这一整年的时间和劳动之后,我终于开源了我的版本var_dump,Kint。在the project page或直接in github中了解它。

这是一个截图:

对不起插头:)


编辑:我想提醒评论者,这不是一个支持论坛,如果你有问题/想要一个功能,请file an issue。支持请求评论将被标记为删除。


6
投票

这是我的:

class sbwDebug
{
    public static function varToHtml($var = '', $key = '')
    {
        $type = gettype($var);
        $result = '';

        if (in_array($type, ['object', 'array'])) {
            $result .= '
        <table class="debug-table">
            <tr>
            <td class="debug-key-cell"><b>' . $key . '</b><br/>Type: ' . $type . '<br/>Length: ' . count($var) . '</td>
            <td class="debug-value-cell">';

            foreach ($var as $akey => $val) {
                $result .= sbwDebug::varToHtml($val, $akey);
            }
            $result .= '</td></tr></table>';
        } else {
            $result .= '<div class="debug-item"><span class="debug-label">' . $key . ' (' . $type . '): </span><span class="debug-value">' . $var . '</span></div>';
        }

        return $result;
    }
}

风格:

table.debug-table {
  padding: 0;
  margin: 0;
  font-family: arial,tahoma,helvetica,sans-serif;
  font-size: 11px;
}

td.debug-key-cell {
  vertical-align: top;
  padding: 3px;
  border: 1px solid #AAAAAA;
}

td.debug-value-cell {
  vertical-align: top;
  padding: 3px;
  border: 1px solid #AAAAAA;
}

div.debug-item {
  border-bottom: 1px dotted #AAAAAA;
}

span.debug-label {
  font-weight: bold;
}

5
投票

我最近开发了一个免费的chrome扩展(正在进行中),以便美化我的var转储,没有库,没有预标记,也没有安装到每个应用程序。全部使用JavaScript和regEx完成。你所要做的就是安装扩展程序和你的好处。我也在开发Firefox版本。这是GitHub页面。我希望很快就能在chrome和firefox网站上提供它!

https://github.com/alexnaspo/var_dumpling

这是一个示例输出:


2
投票

Tracy使用dump() function有一个漂亮的可折叠输出。


1
投票

那些花哨的图书馆很棒...除了开销。如果你想要一个简单,漂亮的var_dump,它需要无限的参数,试试我的函数。它添加了一些简单的HTML。数据属性也被添加,如果您使用HTML5,较低版本将忽略它们,但是如果您在屏幕上看到的内容不够,则可以轻松地在浏览器控制台中打开元素并获取更多信息。

布局非常简单,没有开销。为每个参数提供大量信息,包括gettype甚至是对象转储(包括XML)的class名称。这是经过验证的,我多年来一直在使用它。

function preDump() {    //  use string "noEcho" to just get a string return only
    $args = func_get_args();
    $doEcho = TRUE; $sb;
    if ($args) {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;padding:0em 3em 1em 1em;"><legend><b>preDump: '.count($args).' Parameters Found.</b></legend>';
        foreach (func_get_args() as $arg) {
            if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(preDump: )[0-9]+/', 'preDump: '.(count($args)-1), $sb); continue; }
            $sb .= '<pre data-type="'.gettype($arg).'"';
            switch (gettype($arg)) {
                case "boolean":
                case "integer":
                    $sb .= ' data-dump="json_encode"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= json_encode($arg);
                    break;
                case "string":
                    $sb .= ' data-dump="echo"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= $arg;
                    break;
                default:
                    $sb .= ' data-dump="var_dump"';
                    if (is_object($arg)) $sb .= 'data-class="'.get_class($arg).'"';
                    $sb .= '><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')';
                    if (is_object($arg)) $sb .= ' ['.get_class($arg).']';
                    $sb .= '</b></p><p>';
                    ob_start();
                    var_dump($arg);
                    $sb .= ob_get_clean();
                    if (ob_get_length()) ob_end_clean();
            }
            $sb .= '</p></pre>';
        }
        $sb .= '</fieldset></div>';
    }
    else {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;"><legend><b>preDump: [ERROR]</b></legend><h3>No Parameters Found</h3></fieldset></div>';
    }
    if ($doEcho) echo($sb);
    return $sb;
}

如果你使用Codeigniter,也可以将你的CI添加得非常简单。首先,去application/config/autoload.php并确保helper 'string'开启。

$autoload['helper'] = array( 'string' ); 

然后只需在MY_string_helper.php中创建一个名为application/helpers的文件,然后在典型的if语句中简单插入该函数以进行存在检查。

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
    if (!function_exists('preDump')) {
        function preDump() {
            ...
        }
    }
//  DON'T CLOSE PHP

| OR |,如果你想采取不同的方向。

以下代码段与上面相同,只是在浏览器控制台中显示您的变量。这有时可以更容易地调试sql对象调用以及缺少密钥名称或其他任何内容的其他数组和对象调用。

function consoleDump() {    //  use string "noEcho" to just get a string return only
    $args = func_get_args();
    $doEcho = TRUE; $sb;
    if ($args) {
        $sb = '<script type="text/javascript">console.log("<" + new Array('.(count($args) < 10 ? '49': '48').').join("-") + "[consoleDump: '.count($args).' items]" + new Array(50).join("-") + ">"); console.log([';

        foreach (func_get_args() as $i => $arg) {
            if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(consoleDump: )[0-9]+/', 'consoleDump: '.(count($args)-1), $sb); continue; }
            $sb .= '{ "type": "'.gettype($arg).'", ';
            switch (gettype($arg)) {
                case "boolean":
                case "integer":
                case "string":
                    $sb .= '"value": '.json_encode($arg);
                    break;
                default:
                    $sb .= '"value": '.json_encode($arg);
                    if (is_object($arg) || is_array($arg)) $sb .= ', "count": '.json_encode(count((array)$arg));
                    if (is_object($arg)) $sb .= ', "objectClass": "'.get_class($arg).'"';
            }
            $sb .= '}';
            if ($i < count($args)-1) $sb .= ', ';
        }
        $sb .= ']); console.log("<" + new Array(120).join("-") + ">"); </script>';
    }
    else {
        $sb = '<script type="text/javascript">console.log("<" + new Array(120).join("-") + ">");console.log("consoleDump: [ERROR] No Parameters Found");console.log("<" + new Array(120).join("-") + ">");</script>';
    }
    if ($doEcho) echo($sb);
    return $sb;
}

适用于一切!

consoleDump($simpXMLvar, $_SESSION, TRUE, NULL, array( 'one' => 'bob', 'two' => 'bill' ), (object)array( 'one' => 'bob', 'two' => 'bill' ));


<------------------------------------------------[consoleDump: 6 items]------------------------------------------------->
[Object, Object, Object, Object, Object, Object] 
// This drops down to show your variables in JS objects, like:
    0: Object
        count: 4
        objectClass: "SimpleXMLElement"
        type: "object"
        value: Object
        __proto__: Object
        // ...etc...
<-----------------------------------------------------------------------------------------------------------------------> 

1
投票

为了使列表更加完整 - Symfony开发人员发布了一个可用的独立转储器替代方案:

https://github.com/symfony/var-dumper

你可以在这里阅读更多内容:

http://www.sitepoint.com/var_dump-introducing-symfony-vardumper/


0
投票

我写的小类与Krumo类似,但更容易嵌入到app中。

这是链接:https://github.com/langpavel/PhpSkelet/blob/master/Classes/Debug.php

这里的示例输出:http://langpavel.php5.cz/debug_sample.html


0
投票

PHP Array Beautifier这个简单的工具在PHP中使用数组或对象输出,例如print_r()语句,并以彩色编码格式化以便轻松读取数据。 http://phillihp.com/toolz/php-array-beautifier/


0
投票

另一个本土版本:

http://github.com/perchten/neat_html

我觉得它非常灵活。它不针对特定的输出环境,但有一堆可选参数,您可以指定更改输出/打印或行为的原因,以及一些持久性设置。


0
投票

0
投票

我开发了镀铬扩展和jquery plugin以美化var_dumps

https://github.com/netfox01/fleX-debug


44
投票

我首选的是var_dump函数,as provided by the Xdebug extension:只需安装扩展程序(简单,在Windows和Linux上),var_dump获得更好的输出:

  • 更好的格式 HTML 颜色
  • 并且您可以选择调整应显示的信息量

并快速截图:

xdebug

当然,Xdebug带来了许多其他有用的东西,比如远程调试(例如PHP应用程序的图形调试,例如Eclipse PDT),分析,...


0
投票

我首选的是来自https://github.com/hazardland/debug.php的调试,enter image description here是只包含名为debug的单个函数的库(您可以在项目或库中复制该函数)。典型的debug()html输出如下所示:

string : "Test string" boolean : true integer : 17 float : 9.99 array (array) bob : "alice" 1 : 5 2 : 1.4 object (test2) another (test3) string1 : "3d level" string2 : "123" complicated (test4) enough : "Level 4"

但是你可以输出数据作为具有相同功能的纯文本(带有4个空格缩进选项卡),如果需要,甚至可以将其记录在文件中:

function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . var_export($varval, true) . ";<br>\n";
  else:
    print $varname . " = array();<br>\n";
    foreach ($varval as $key => $val):
      recursive_print ($varname . "[" . var_export($key, true) . "]", $val);
    endforeach;
  endif;
}

0
投票

如果你在PHP中处理非常大的数组,这个函数可能会有所帮助:

$a = array();
$a[0] = 1;
$a[1] = 2;
$a[2] = array();
$a[2][0] = 'a';
$a[2][1] = 'b';
$a[2][2] = 'c';

它基本上转储整个数组,其中每个元素在单独的行中,这有利于为某些元素找到正确的完整路径。

示例输出:

How to export PHP array where each key-value pair is in separate line?

见:highlight_string("\n<?" . var_export($var, true) . "?>\n");


0
投票

我的,更简单,对我来说,我没有很多知识/时间来更改基础设施安装xdebug等。

而在其他情况下,例如,对于简单的WP网站而言,您并不需要太多

所以我使用:

https://codeinphp.github.io/post/outputting-php-to-browser-console/

这真的对我很有帮助。

但是因为我更喜欢DevConsole环境,所以我使用了这个非常棒但很简单的功能:

<?php /** * Logs messages/variables/data to browser console from within php * * @param $name: message to be shown for optional data/vars * @param $data: variable (scalar/mixed) arrays/objects, etc to be logged * @param $jsEval: whether to apply JS eval() to arrays/objects * * @return none * @author Sarfraz */ function logConsole($name, $data = NULL, $jsEval = FALSE) { if (! $name) return false; $isevaled = false; $type = ($data || gettype($data)) ? 'Type: ' . gettype($data) : ''; if ($jsEval && (is_array($data) || is_object($data))) { $data = 'eval(' . preg_replace('#[\s\r\n\t\0\x0B]+#', '', json_encode($data)) . ')'; $isevaled = true; } else { $data = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); } # sanitalize $data = $data ? $data : ''; $search_array = array("#'#", '#""#', "#''#", "#\n#", "#\r\n#"); $replace_array = array('"', '', '', '\\n', '\\n'); $data = preg_replace($search_array, $replace_array, $data); $data = ltrim(rtrim($data, '"'), '"'); $data = $isevaled ? $data : ($data[0] === "'") ? $data : "'" . $data . "'"; $js = <<<JSCODE \n<script> // fallback - to deal with IE (or browsers that don't have console) if (! window.console) console = {}; console.log = console.log || function(name, data){}; // end of fallback console.log('===== PHP Dump ====='); console.log('$name'); console.log('$type'); console.log($data); console.log('===== / PHP Dump ====='); console.log('\\n'); </script> JSCODE; echo $js; } # end logConsole

小调整:

TVarDumper

-1
投票

var_dump

这是一个很好的工具,旨在取代有缺陷的PHP函数print_rTVarDumper.php,因为它可以正确识别复杂对象结构中的递归引用对象。它还具有递归深度控制,以避免无限递归显示某些特殊变量。

见:var_dump


对于其他替代解决方案,它提供了比print_rUsing print_r and var_dump with circular reference更多的优势,并且可以支持循环引用,请检查:How do you debug PHP scripts?


有关更多想法,请查看:<pre>


-1
投票

我很惊讶没有人提到最简单的(虽然不是很漂亮)代码。如果你只是想得到一个可读的输出(没有颜色或缩进),围绕var_dump的简单echo "<pre>"; var_dump($myvariable); echo "</pre>"; 工作,如:

qazxswpoi

不能比这更低的开销!


33
投票

我写了自己的:REFdemo):

计划是添加纯文本渲染,并显示有关输入表达式的信息,如Kint ...


24
投票

这是我的,我使用内联,非常有用:

$pretty = function($v='',$c="&nbsp;&nbsp;&nbsp;&nbsp;",$in=-1,$k=null)use(&$pretty){$r='';if(in_array(gettype($v),array('object','array'))){$r.=($in!=-1?str_repeat($c,$in):'').(is_null($k)?'':"$k: ").'<br>';foreach($v as $sk=>$vl){$r.=$pretty($vl,$c,$in+1,$sk).'<br>';}}else{$r.=($in!=-1?str_repeat($c,$in):'').(is_null($k)?'':"$k: ").(is_null($v)?'&lt;NULL&gt;':"<strong>$v</strong>");}return$r;};

echo $pretty($some_variable);

16
投票

您正在寻找Krumo(警告,恶意软件的Chrome警报)。

简而言之,Krumo是print_r()和var_dump()的替代品。根据定义,Krumo是一个调试工具(最初用于PHP4 / PHP5,现在仅用于PHP5),它显示有关任何PHP变量的结构化信息。


9
投票

我喜欢Firephp加上firebug

  • 它使用标头写出日志信息,因此它不会破坏AJAX。
  • 为您提供记录的变量/对象的非常好的图形表示
  • 可以显示每个日志语句出现的文件名和行号
  • 易于在项目中使用,可以使用过程API或面向对象的API

8
投票

我一直在使用dBug,它模仿Coldfusion的令人敬畏的cfdump标签:

http://dbug.ospinto.com/examples.php


8
投票

我的(部分)解决方案是简单地添加这样的功能(使用谷歌浏览器):

<?
function console_dump($value)
{ 
?>
<script>
    console.log(<? echo json_encode($value); ?>);
</script>
<?
}
?>

按Ctrl + Shift + J(打开控制台),您可以在那里找到JSON结构。对于JSON应答程序的漂亮打印更有用。


7
投票

我用的一个完整的例子......

<pre>

<?php


//*********** Set up some sample data

$obj = new stdClass;
$obj->a=123;
$obj->pl=44;
$obj->l=array(31,32);

$options = array(
  'Orchestra'=>array(1=>'Strings', 8=>'Brass', 9=>$obj, 3=>'Woodwind', 16=>'Percussion'),
  2=>'Car',
  4=>'Bus',
  'TV'=>array(21=>'Only Fools', 215=>'Brass Eye', 23=>'Vic Bob',44=>null, 89=>false));


//*********** Define the function

function dump($data, $indent=0) {
  $retval = '';
  $prefix=\str_repeat(' |  ', $indent);
  if (\is_numeric($data)) $retval.= "Number: $data";
  elseif (\is_string($data)) $retval.= "String: '$data'";
  elseif (\is_null($data)) $retval.= "NULL";
  elseif ($data===true) $retval.= "TRUE";
  elseif ($data===false) $retval.= "FALSE";
  elseif (is_array($data)) {
    $retval.= "Array (".count($data).')';
    $indent++;
    foreach($data AS $key => $value) {
      $retval.= "\n$prefix [$key] = ";
      $retval.= dump($value, $indent);
    }
  }
  elseif (is_object($data)) {
    $retval.= "Object (".get_class($data).")";
    $indent++;
    foreach($data AS $key => $value) {
      $retval.= "\n$prefix $key -> ";
      $retval.= dump($value, $indent);
    }
  }
  return $retval;
}


//*********** Dump the data

echo dump($options);

?>
</pre>

输出......

Array (4)
 [Orchestra] = Array (5)
 |   [1] = String: 'Strings'
 |   [8] = String: 'Brass'
 |   [9] = Object (stdClass)
 |   |   a -> Number: 123
 |   |   pl -> Number: 44
 |   |   l -> Array (2)
 |   |   |   [0] = Number: 31
 |   |   |   [1] = Number: 32
 |   [3] = String: 'Woodwind'
 |   [16] = String: 'Percussion'
 [2] = String: 'Car'
 [4] = String: 'Bus'
 [TV] = Array (5)
 |   [21] = String: 'Only Fools'
 |   [215] = String: 'Brass Eye'
 |   [23] = String: 'Vic Bob'
 |   [44] = NULL
 |   [89] = FALSE
© www.soinside.com 2019 - 2024. All rights reserved.