每个体面的PHP程序员都有print_r
或var_dump
包装,他们使用,喜欢并指定快捷键,为什么我们不分享我们最喜欢的。
答案 0 :(得分:66)
在问了这一年后的一整年的时间和劳动,我终于开源了我的版本的var_dump,Kint。请在the project page或直接in github中阅读相关内容。
以下是截图:
对不起插件:)
编辑:我想提醒评论者,这不是支持论坛,如果您遇到问题/需要某项功能,请file an issue。支持请求的评论将被标记为删除。
答案 1 :(得分:44)
我首选的是var_dump
函数,as provided by the Xdebug extension:只需安装扩展(在Windows和Linux上都很简单),然后var_dump
获取更好的输出:
快速截图:
当然,Xdebug带来了许多其他有用的东西,比如远程调试(例如PHP应用程序的图形调试,例如Eclipse PDT),分析,......
答案 2 :(得分:33)
答案 3 :(得分:24)
这是我的,我使用内联,非常有用:
$pretty = function($v='',$c=" ",$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)?'<NULL>':"<strong>$v</strong>");}return$r;};
echo $pretty($some_variable);
答案 4 :(得分:16)
您正在寻找Krumo(警告,恶意软件的Chrome警报)。
简而言之,Krumo是print_r()和var_dump()的替代品。根据定义,Krumo是一个调试工具(最初用于PHP4 / PHP5,现在仅用于PHP5),它显示有关任何PHP变量的结构化信息。
答案 5 :(得分:9)
答案 6 :(得分:8)
我一直在使用dBug,它模仿Coldfusion令人敬畏的cfdump
标签:
答案 7 :(得分:8)
我的(部分)解决方案是简单地添加这样的功能(使用谷歌浏览器):
<?
function console_dump($value)
{
?>
<script>
console.log(<? echo json_encode($value); ?>);
</script>
<?
}
?>
按Ctrl + Shift + J(打开控制台),您可以在那里找到JSON结构。对于JSON应答程序的漂亮打印更有用。
答案 8 :(得分: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
答案 9 :(得分: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;
}
答案 10 :(得分:5)
我最近开发了一个免费的chrome扩展程序(正在进行中),以便美化我的var转储,没有库,没有预标签,也没有安装到每个应用程序。全部使用JavaScript和regEx完成。你所要做的就是安装扩展程序和你的好处。我也在开发Firefox版本。这是GitHub页面。我希望很快就能在chrome和firefox网站上提供它!
https://github.com/alexnaspo/var_dumpling
以下是输出示例:
答案 11 :(得分:2)
Tracy 使用dump() function获得了漂亮的可折叠输出。
答案 12 :(得分:1)
那些花哨的图书馆很棒......除了开销。如果你想要一个简单,漂亮的var_dump,它需要无限的参数,试试我的函数。它添加了一些简单的HTML。数据属性也被添加,如果您使用HTML5,较低版本将忽略它们,但是如果您在屏幕上看到的内容不够,则可以轻松地在浏览器控制台中打开元素并获取更多信息。
布局非常简单,没有开销。为每个参数提供大量信息,包括gettype
甚至class
对象转储(包括XML)的名称。这是经过验证的,我多年来一直在使用它。
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...
<----------------------------------------------------------------------------------------------------------------------->
答案 13 :(得分:1)
为了使列表更加完整 - Symfony开发人员发布了一个可用的独立转储器替代方案:
https://github.com/symfony/var-dumper
你可以在这里阅读更多内容:
http://www.sitepoint.com/var_dump-introducing-symfony-vardumper/
答案 14 :(得分:0)
这是我为解决此问题而编写的chrome扩展。
https://chrome.google.com/webstore/detail/varmasterpiece/chfhddogiigmfpkcmgfpolalagdcamkl
答案 15 :(得分:0)
PHP Array Beautifier 这个简单的工具在PHP中使用数组或对象输出,例如print_r()语句,并以彩色编码格式化以便轻松读取数据。 http://phillihp.com/toolz/php-array-beautifier/
答案 16 :(得分:0)
另一个本土版本:
http://github.com/perchten/neat_html
我觉得它非常灵活。它没有针对特定的输出环境,但有一堆可选参数,你可以指定为什么要改变输出/打印或行为,以及一些持久性设置。
答案 17 :(得分:0)
我写了类似于Krumo的小班,但更容易嵌入到app中。
这是链接:https://github.com/langpavel/PhpSkelet/blob/master/Classes/Debug.php
答案 18 :(得分:0)
我开发了一个chrome扩展名jquery plugin以美化var_dumps
答案 19 :(得分:0)
我首选的是来自https://github.com/hazardland/debug.php的 debug ,这是一个只包含名为 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"
答案 20 :(得分:0)
如果你正在处理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';
请参阅:How to export PHP array where each key-value pair is in separate line?
答案 21 :(得分: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
答案 22 :(得分:0)
答案 23 :(得分:0)
我不得不在这里添加另一个答案,因为我真的不想遍历其他解决方案中的步骤。它非常简单,不需要扩展,包含等,这就是我的首选。这非常容易而且非常快捷。
首先只是对要讨论的变量进行json_encode:
if(isset($_POST['cond'])){
echo '<br><p>Script to execute : xxxx.php<p>';
echo "<p>Executing</p>";
if (ob_get_length()) {
ob_end_flush();
flush();
}
shell_exec('sleep 5');
echo "<p>Done</p>";
}
将您获得的结果复制到http://jsoneditoronline.org/的JSON编辑器中,只需将其复制到左侧窗格中,单击 Copy> 即可以一种非常漂亮的树格式打印JSON。
针对每个人,但希望这可以帮助其他人有一个更好的选择! :)
答案 24 :(得分:-1)
这是一个很好的工具,旨在取代错误的PHP函数var_dump
和print_r
,因为它可以正确识别复杂对象结构中的递归引用对象。它还具有递归深度控制,以避免无限递归显示某些特殊变量。
请参阅:TVarDumper.php
。
对于提供比var_dump
和print_r
更多优势并且可以支持循环引用的其他替代解决方案,请检查:Using print_r and var_dump with circular reference。
有关更多提示,请另请查看:How do you debug PHP scripts?
答案 25 :(得分:-1)
我很惊讶没有人提到最简单的(虽然不是很漂亮)代码。如果您只想获得可读的输出(没有颜色或缩进), public function store(Request $request)
{
if($request->has('img')) {
foreach($request->get('img') as $key => $img)
$fileNameExt = $img->getClientOriginalName();
$fileName = pathinfo($fileNameExt, PATHINFO_FILENAME);
$fileExt = $img->getClientOriginalExtension();
$fileNameToStore = $fileName.'_'.time().'.'.$fileExt;
$pathToStore = $img->storeAs('public/images',$fileNameToStore);
$info = new Info;
$info->name = $request->input('Name')[$key];
$info->img = $fileNameToStore;
$info->page_id = $page->id;
$info->save();
}
}
周围的简单<pre>
就可以了,如:
var_dump
不能比这更低的开销!