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

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

问完这一整年的时间和劳动后,我终于开放了我的版本var_dump,Kint。 在项目页面阅读,或直接在github上阅读 。

这是一个稍微过时的截图,展示了三个可用的主题:

kint主题

对不起,插件:)


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

我最喜欢的是var_dump函数, 由Xdebug扩展提供 :只需安装扩展(在Windows和Linux上都很容易) ,并且var_dump可以获得更好的输出:

  • 更好的格式化
    • HTML
    • 颜色
  • 而且您可以select调整显示的信息量

并快速截图:

Xdebug的

而且,当然,Xdebug带来了大量其他有用的东西,比如远程debugging(例如在PHP PDT中的graphics化debugging,例如Eclipse PDT) ,性能分析,…

我写了自己的: REF ( demo ):

r()输出

计划是添加纯文本渲染,并显示有关inputexpression式像Kint做…

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

 $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); 

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

简而言之,Krumo是print_r()和var_dump()的替代品。 按照定义,Krumo是一个debugging工具(最初用于PHP4 / PHP5,现在仅用于PHP5),它显示关于任何PHPvariables的结构化信息。

我喜欢Firephp加上萤火虫

  • 它使用标题写入日志信息,所以它不会中断AJAX。
  • 给你一个非常好的graphics表示你login的variables/对象
  • 可以显示每个日志语句出现的文件名和行号
  • 易于在您的项目中使用,无论是使用过程式或面向对象的API

我的(部分)解决scheme是简单地添加一个像这样的function(使用Google Chrome):

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

按Ctrl + Shift + J(打开控制台),你可以find那里的JSON结构。 更有用的JSON响应的一个漂亮的印刷品的课程。

我一直在使用dBug,它模拟Coldfusion的真棒cfdump标签:

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

一个完整的例子,我使用…

 <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 

这是我的:

 public function varToHtml($var='', $key='') { $type = gettype($var); $result = ''; if (in_array($type, array('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; } 

我最近开发了一个免费的Chrome扩展(工作正在进行中),以美化我的无库转储,没有预标签,并没有安装到每个应用程序。 全部使用JavaScript和regEx完成。 所有你需要做的就是安装扩展和你的好去。 我也在开发Firefox版本。 这是GitHub页面。 我希望很快就能在Chrome和Firefox上使用它!

https://github.com/alexnaspo/var_dumpling

这是一个输出示例:

输出示例

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

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

布局非常简单,没有开销。 为每个参数提供大量的信息,包括gettype ,甚至Object dump(包括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 EXTREMELY SIMPLY中。 首先,进入application/config/autoload.php并确保helper 'string'是打开的。

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

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

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

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

以下片段与上述内容相同,除了将在浏览器控制台中显示您的variables。 这有时可以更容易地debuggingsql对象调用和其他数组和对象调用,如果你错过了键名或其他什么。

 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... <-----------------------------------------------------------------------------------------------------------------------> 

为了使清单更完整 – Symfony开发人员发布了一个可用的独立式自卸车替代scheme:

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

你可以在这里阅读更多:

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

我很惊讶没有提到最简单的(尽pipe不是很漂亮)的代码。 如果你只是想得到一个可读的输出(没有颜色或缩进),一个简单的<pre>围绕var_dump起作用,如下所示:

 echo "<pre>"; var_dump($myvariable); echo "</pre>"; 

不能得到比这更低的开销!

我写了一个类似于Krumo的小课程,但更容易embedded到应用程序中。

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

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

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

又一个本土版本:

http://github.com/perchten/neat_html

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

我开发了一个Chrome扩展和jQuery插件 ,以美化var_dumps

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

我的首选是从https://github.com/hazardland/debug.php debugging ,这是一个库,只包含一个名为debug的函数(你可以在你的项目或库中复制这个函数) 。 典型的debug() html输出如下所示:

在这里输入图像描述

但是你也可以像这样以纯文本的forms输出数据(这里有4个空格缩进的标签)(如果需要的话,甚至可以把它们logging在文件中):

 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" 

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

 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; } 

它基本上是将整个数组放在一个单独的行中,这对于为某些元素find正确的完整path是有益的。

示例输出:

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

请参阅: 如何导出每个键 – 值对在不同行中的PHP数组?

TVarDumper

这是一个很好的工具,它是用来替代有问题的PHP函数var_dumpprint_r ,因为它可以正确识别复杂对象结构中recursion引用的对象。 它也有一个recursion的深度控制,以避免无限recursion显示一些特殊的variables。

请参阅: TVarDumper.php


对于比var_dumpprint_r提供更多优点的其他替代解决scheme,并且可以支持循环引用,请检查: 使用带有循环引用的print_r和var_dump 。


更多的想法,请检查: 如何debuggingPHP脚本?