PHP中更漂亮/更实用的Var_dump替代方案?[关闭]


130

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


39
我只是使用echo'<pre>'; print_r($ var); exit; 我什至不关闭它。我想我不太体面
Funky Dude,2010年

我编辑了指向github的链接,在这里我继续Kint开发,如果仍然有任何问题,请通过任何方式告知我。
raveren 2012年

1
嘿,Kint很酷!它挽救了我的一天。
伊什特万Ujj-梅萨罗斯

2
为什么一个问题是某个程序的广告通知被100%转换为“我自己创建var_dump()”版本?第一个问题是为什么要允许产品广告作为问题。
m3nda

11
因为我在问了问题一年多后才制作了该工具。我不知道是什么困扰着我,我创建了一个10k +行的成熟开源工具,并在数年后不断对其进行改进。我在问题中提供了自己的答案-正如SO的传统一样。
raveren

Answers:


70

询问了整整一年的时间和精力之后,我终于将我的var_dump版本(Kint)开源了。在项目页面或直接在github中阅读它。

这是屏幕截图:

结

对不起,插头:)


编辑:我只想提醒评论者,这不是支持论坛,如果您有问题/想要功能,请提出问题。支持请求评论的内容将被标记为删除。


我不得不更改字体大小,并美化CSS代码,但是做得不错,我喜欢它……来自长期的Krumo用户
Quamis 2011年

1
您做了什么更改,如果您认为这是一项改进,可以将更改发送给我raveren@gmail.com
raveren 2011年

我习惯了Krumo,我想使用较小的字体,并且还美化了CSS代码。没有什么可以说是实际的改进,更像是一个老习惯:)
Quamis 2011年

很好的想法是,css应该与js一起压缩,以便尽可能少地干扰实际输出。当然,生成的源漂亮的压痕计划过,但我现在没有时间投入到编制品..
raveren

2
举个例子,如果您转储一个对象,Kint会显示受保护的变量和私有变量,而krumo则不会(因为只有前者使用了我假设的反射类)。总的来说,我发现Kint更好。尽管我还必须调整css以使其更可用(在倾倒大量嵌套属性时,巨大的字体效果不佳)。哦,其背后的代码不是一团糟,不能说克鲁姆(抱歉克鲁姆作者!)
马恩(Mahn

45

我上者优先的是var_dump功能,如Xdebug扩展提供:刚安装扩展(容易,无论是在Windows和Linux) ,并var_dump得到一个更好的输出:

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

和快速截图:

调试器


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


1
我需要在共享主机中使用此xdebug格式化类。有什么办法可以将其包含在我的个人项目中?
Anyul Rivas 2012年

1
如果您不是服务器的管理员(超级用户),则很可能将无法安装PHP扩展(我从未见过共享的托管服务会安装一个PHP扩展)。因此,不,您将无法使用Xdebug (无论如何,将其安装在生产服务器上通常不是一个好主意:毕竟,这是调试扩展);您将不得不依靠变量输出函数的基于PHP的实现(请参见其他答案)
Pascal MARTIN

1
是的,我只需要类在发生错误时向自己发送一些输出即可。
Anyul Rivas 2012年

34

我写了自己的:REFdemo):

r()输出

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


4
干得好,非常好的工具
ssuperczynski 2013年

2
REF很棒,色彩鲜艳,速度快。我用它所有的时间。
Marty McGee 2014年

2
很棒的工具,我刚切换到它。谢谢!
Andris

少数人使用作曲家,嗯...不是我。如果要创建一个,dll我将使用此“调试”。谢谢,辛苦了!
Alex

27

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

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

2
喜欢这个功能-简单明了,我说的很简单:)
derekdreery 2013年

谢谢。我用它所有的时间。确实应该内置到PHP中。您可以使用第二个参数以自己的格式设置。例如echo $ pretty($ some_variable,“-”);
Guillermo Phillips

7
精美地结合了print_r,var_dump和var_export的所有最差的功能。没有html的转义,仅接受单个参数,挂在递归上,不能返回输出,并且最重要的是,它完全不可读。我不想成为一个混蛋,但评论只是使它看起来如此完美。
raveren 2013年

感谢您对@Raveren的评论。如果您可以更具体一些,那么我会改善答案。
吉列尔莫·菲利普斯

2
IMO最好的单线解决方案就是简单function pretty(){echo'<pre>';foreach(func_get_args()as $arg){ob_start();var_dump($arg);echo htmlentities(ob_get_clean())."\n#####\n#####\n\n";}die;}。Var_dump是一个非常冗长的函数,它处理所有PHP边缘情况(其中有很多),并且即使不那么可读也可以100%稳定。但是,归根结底,如果您发现自己的实现最适合您,那绝对是您应该使用的实现。
raveren

16

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

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


这太棒了!谢谢。+1
the_drow 2010年

2
当我尝试时,它坏了。我报了,但没有回答和没有新版本
Mawg说起用莫妮卡

2
@Pekka链接在Chrome中引发了恶意软件警告。
Tim Post

今天krumo已经由这个人github.com/mmucklo/krumo更新(但Kint可能更好,更多细节)
lolesque 2015年

9

我爱Firephp萤火虫

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


8

我的(部分)解决方案是简单地添加一个如下函数(使用Google Chrome):

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

按Ctrl + Shift + J(打开控制台),您可以在其中找到JSON结构。对于漂亮的JSON响应打印更加有用。


8

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

<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

1
我将\ n更改为PHP_EOL,当从窗口的CMD使用php时,这很好用
iewebguy 2014年

7

这是我的:

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

2
实际上还不错。如果您显示输出示例,则可能会被更多地投票。
Mawg说

@acSlater对我有用,您只需要创建sbwDebug他忘记发布的类并将函数放在其中。
Dennis98 2013年

6

我最近开发了一个免费的chrome扩展程序(正在开发中),以美化我的var转储,其中没有库,没有预标签并且没有为每个应用程序安装。所有这些都使用JavaScript和regEx完成。您所要做的就是安装扩展程序,一切顺利。我也在开发Firefox版本。这是GitHub页面。我希望它能很快在chrome和firefox网站商店中提供!

https://github.com/alexnaspo/var_dumpling

这是示例输出:

输出示例


6
好兄弟!刚刚下载了扩展程序,它可以完美运行!谢谢!
coryj 2012年

5
杜德...谢谢。我一直在寻找这样的东西
广泛的

1
虚幻。最好的选择了!
基督教徒

尝试与Firefox 15兼容。有机会绕过这个吗?
cyberfly

1
这很漂亮,希望我早点找到它!


2

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

布局非常简单,无开销。为每个参数提供大量信息,包括对象转储(包括XML)的名称gettype甚至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.phpin 的文件,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
为什么要担心开发工具的性能下降可忽略不计?从字面上看,该函数echo '<pre>';var_dump($var);echo '</pre>';加上一些零值加法文本。
raveren

@Raveren是的,除了echo'pre preDump('value', TRUE, array( 'bob => 'bill' ), (object)array( 'bob => 'bill' )' is quick and easy and gives a nice layout visually in the browser that shows each variable passed in it's own "area" with a type label, thus making debugging quick and easy. And since it's a snippet i keep in my IDE's toolbox, i can recall it with ease on any needed page or while working with any library. But sure, it's just an '; var_dump`及其simple html周围,​​而不是零值添加文本。哈哈kik。如果您不喜欢它,请不要使用它。只是一个建议。
SpYk3HH 2013年

@Raveren如果你喜欢那...你会真的很喜欢我的更新:P
SpYk3HH 2013年





1

如果您要使用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;
}

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

输出示例:

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

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


1

我很惊讶没有人提到最简单的(尽管不是很漂亮)代码。如果您只想获得可读的输出(没有颜色或压痕),则可以使用简单<pre>的方法var_dump,例如:

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

无法获得比这更低的开销!



0

我的首选方法是从https://github.com/hazardland/debug.php进行调试,该库仅包含一个名为debug的函数(您可以仅在项目或库中复制该函数)。典型的debug() html输出如下所示:

在此处输入图片说明

但是您也可以将数据输出为具有相同功能的纯文本(带有4个空格缩进的制表符),例如(甚至在需要时将其记录在文件中):

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"

0

TVarDumper

这是一个很棒的工具,旨在替换有问题的PHP函数,var_dumpprint_r,因为它可以正确识别复杂对象结构中的递归引用的对象。它还具有递归深度控制,以避免不确定地递归显示某些特殊变量。

请参阅:TVarDumper.php


对于其他替代解决方案,这些替代解决方案在循环引用方面更具优势var_dumpprint_r并且可以支持循环引用,请检查:将print_r和var_dump与循环引用一起使用


有关更多建议,请另外检查:如何调试PHP脚本?


0

我的,是一个更简单的方法,对我而言,我没有太多的知识/时间来更改基础架构,安装xdebug等。

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

所以我用:

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

确实对我有很大帮助。

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

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

小调整:

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

0

另一种选择是

composer require symfony/var-dumper --save-dev

然后,在文件中只使用它dump($var) ,最终将得到如下输出在此处输入图片说明


0

我不得不在这里添加另一个答案,因为我真的不想遍历其他解决方案中的步骤。它非常简单,不需要扩展,包含等,这是我的首选。这非常容易而且非常快速。

首先只需对问题变量json_encode:

echo json_encode($theResult);

将您获得的结果复制到位于http://jsoneditoronline.org/的JSON编辑器中,只需将其复制到左侧窗格中,单击Copy>,它就会以一种非常漂亮的树格式打印JSON。

对于每个人自己,但是希望这可以帮助其他人有一个更好的选择!:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.