У каждого достойного PHP-программиста есть оболочка print_r
или var_dump
они используют, любят и назначают сочетания клавиш, почему бы нам не поделиться нашими любимыми .
Полный год времени и труда, спросив об этом, я, наконец, открыл свою версию var_dump, Kint. Читайте об этом на странице проекта или непосредственно в github .
Вот немного устаревший скриншот, демонстрирующий три доступные темы:
Извините за плагин 🙂
EDIT: Я хотел бы напомнить комментаторам, что это не форум поддержки, если у вас возникли проблемы / нужна функция, пожалуйста, напишите о проблеме . Запросы для комментариев поддержки будут помечены для удаления.
Я предпочитаю функцию var_dump
, как это предусмотрено расширением Xdebug : просто установите расширение (простое, как на Windows, так и на Linux) , а var_dump
получает лучший результат:
И быстрый снимок экрана:
И, конечно же, Xdebug приносит множество других полезных вещей, таких как удаленная отладка (например, графическая отладка вашего приложения PHP, например, в Eclipse PDT) , профилирование, …
Я написал свой собственный: REF ( demo ):
Планы включают добавление текстового изображения и отображение информации о входном выражении, например Kint.
Вот мой, который я использую inline, очень полезен:
$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);
Вы ищете Krumo ( предупреждение, предупреждения Chrome для вредоносных программ ).
Проще говоря, Krumo является заменой для print_r () и var_dump (). По определению, Krumo – это инструмент отладки (первоначально для PHP4 / PHP5, теперь только для PHP5), который отображает структурированную информацию о любой переменной PHP.
Я люблю Firephp plus firebug
Мое (частичное) решение для этого – просто добавить такую функцию (используя Google Chrome):
<? function console_dump($value) { ?> <script> console.log(<? echo json_encode($value); ?>); </script> <? } ?>
Нажмите Ctrl + Shift + J (открывает консоль), и вы можете найти там структуру JSON. Еще более полезно для красивой печати отзывов JSON.
Я использовал dBug, который эмулирует потрясающий тег cfdump
Coldfusion:
Полный пример того, что я использую …
<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 (работа в процессе), чтобы украсить мои дампы var без библиотек, никаких предварительных тегов и никакой установки для каждого приложения. Все сделано с использованием JavaScript и regEx. Все, что вам нужно сделать, это установить расширение и ваше преимущество. Я также работаю над версией Firefox. Вот страница GitHub. Я надеюсь, что он будет доступен в хромовых и firefox-магазинах в ближайшее время!
https://github.com/alexnaspo/var_dumpling
Вот пример вывода:
У Tracy есть красивый сбрасываемый вывод с использованием функции dump () .
Эти фантастические библиотеки великолепны … кроме накладных расходов. Если вы хотите простой, довольно 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 EXTREMELY SIMPLY. Сначала перейдите в application/config/autoload.php
и убедитесь, что helper
'string'
helper
.
$autoload['helper'] = array( 'string' );
Затем просто MY_string_helper.php
файл с именем 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... <----------------------------------------------------------------------------------------------------------------------->
Чтобы сделать список более полным – разработчики Symfony выпустили альтернативную альтернативу:
https://github.com/symfony/var-dumper
Вы можете прочитать об этом здесь:
http://www.sitepoint.com/var_dump-introducing-symfony-vardumper/
Я удивлен, что никто не упомянул простейший (хотя и не очень красивый) код. Если вы просто хотите получить читаемый результат (без цветов или отступов), простую <pre>
вокруг var_dump
работает, как в:
echo "<pre>"; var_dump($myvariable); echo "</pre>";
Не может быть намного ниже, чем это!
Я написал небольшой класс, который похож на Krumo, но гораздо проще встраивать в приложение.
Вот ссылка: https://github.com/langpavel/PhpSkelet/blob/master/Classes/Debug.php
И вот пример вывода: http://langpavel.php5.cz/debug_sample.html
PHP Array Beautifier Этот простой инструмент принимает вывод массива или объекта в PHP, такой как оператор print_r () и форматирует его в цветовом кодировании, чтобы легко читать ваши данные. http://phillihp.com/toolz/php-array-beautifier/
Еще одна домашняя версия:
http://github.com/perchten/neat_html
Мне нравится думать, что это довольно гибко. Он не нацелен на конкретную среду вывода, но содержит множество необязательных аргументов, которые вы можете указать, почему нужно изменить вывод / печать или поведение, а также некоторые постоянные настройки.
Вот хром-расширение, которое я написал для решения этой проблемы.
https://chrome.google.com/webstore/detail/varmasterpiece/chfhddogiigmfpkcmgfpolalagdcamkl
Я разработал расширение chrome и плагин jquery , чтобы украсить var_dumps
Я предпочитаю отлаживать от 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"
Если вы имеете дело с очень большими массивами в 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, где каждая пара значений ключа находится в отдельной строке?
Это отличный инструмент, который предназначен для замены багги-функции PHP var_dump
и print_r
, поскольку он может корректно идентифицировать объекты с рекурсивно-ориентированными объектами в сложной структуре объекта. Он также имеет рекурсивный контроль глубины, чтобы избежать неопределенного рекурсивного отображения некоторых особых переменных.
См .: TVarDumper.php
.
Для других альтернативных решений, которые предоставляют больше преимуществ по сравнению с var_dump
и print_r
и могут поддерживать циклические ссылки, проверьте: Использование print_r и var_dump с круговой ссылкой .
Для получения дополнительных идей проверьте также: как вы отлаживаете PHP-скрипты?