У каждого приличного программиста PHP есть оболочка print_r
или, которую var_dump
он использует, любит и назначает сочетания клавиш, почему бы нам не поделиться своими любимыми .
У каждого приличного программиста PHP есть оболочка print_r
или, которую var_dump
он использует, любит и назначает сочетания клавиш, почему бы нам не поделиться своими любимыми .
Ответы:
Спустя целый год работы и времени после того, как я спросил об этом, я наконец открыл исходный код своей версии var_dump, Kint. Об этом читайте на странице проекта , или прямо в github .
Вот скриншот:
Простите за вилку :)
РЕДАКТИРОВАТЬ: Я просто хотел бы напомнить комментаторам, что это не форум поддержки, если у вас возникли проблемы / вы хотите использовать функцию, сообщите о проблеме . Комментарии, запрашивающие поддержку, будут помечены для удаления.
Я предпочитаю var_dump
функцию, предоставляемую расширением Xdebug : просто установите расширение (легко, как в Windows, так и в Linux) , и var_dump
получите лучший результат:
И быстрый скриншот:
И, конечно же, Xdebug предоставляет множество других полезных вещей, таких как удаленная отладка (то есть графическая отладка вашего PHP-приложения, например, в Eclipse PDT) , профилирование, ...
Планируется добавить рендеринг только текста и отображать информацию о входном выражении, как это делает Kint ...
dll
я воспользуюсь этой «отладкой». Спасибо, и хорошей работы!
Вот мой, который я использую 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);
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% стабильна, хотя и не так удобочитаема. Но, в конце концов, если вы сочтете, что ваша реализация лучше всего подходит для вас, вы обязательно должны использовать ее.
Вы ищете Krumo ( Предупреждение, предупреждения Chrome о вредоносном ПО ).
Проще говоря, Krumo - это замена print_r () и var_dump (). По определению Krumo - это инструмент отладки (первоначально для PHP4 / PHP5, теперь только для PHP5), который отображает структурированную информацию о любой переменной PHP.
Я использовал dBug, который имитирует отличный тег Coldfusion cfdump
:
Мое (частичное) решение - просто добавить такую функцию (с помощью Google Chrome):
<?
function console_dump($value)
{
?>
<script>
console.log(<? echo json_encode($value); ?>);
</script>
<?
}
?>
Нажмите Ctrl + Shift + J (открывает консоль), и вы можете найти там структуру JSON. Еще более полезно для красивой печати ответов JSON, конечно.
Полный пример того, что я использую ...
<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
Вот мой:
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;
}
sbwDebug
класс, который он забыл опубликовать, и поместить в него функцию.
Недавно я разработал бесплатное расширение chrome (в стадии разработки), чтобы украсить свои дампы var без библиотек, без предварительных тегов и без установки для каждого приложения. Все сделано с помощью JavaScript и regEx. Все, что вам нужно сделать, это установить расширение и готово. Я тоже работаю над версией Firefox. Вот страница GitHub. Я надеюсь, что скоро он будет доступен в интернет-магазинах Chrome и Firefox!
https://github.com/alexnaspo/var_dumpling
Вот пример вывода:
Tracy имеет красивый разборный вывод , используя дамп () функцию .
Эти модные библиотеки великолепны ... кроме накладных расходов. Если вам нужен простой и красивый 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
in application/helpers
и просто вставьте функцию в типичный if
оператор для проверки существования.
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
if (!function_exists('preDump')) {
function preDump() {
...
}
}
// DON'T CLOSE PHP
| ИЛИ |, если вы хотите пойти в другом направлении.
Следующий фрагмент аналогичен приведенному выше, за исключением того, что ваши переменные будут отображаться в консоли браузера. Иногда это может упростить отладку вызовов объектов 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...
<----------------------------------------------------------------------------------------------------------------------->
echo '<pre>';var_dump($var);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
echo 'pre'; var_dump` simple html
, а не текст, добавляющий 0. лол кик. Если вам это не нравится, не используйте это. Просто предложение.
PHP Array Beautifier Этот простой инструмент принимает массив или объект, выводимый в PHP, такой как оператор print_r (), и форматирует его с помощью цветовой кодировки, чтобы легко читать ваши данные. http://phillihp.com/toolz/php-array-beautifier/
Еще одна доморощенная версия:
http://github.com/perchten/neat_html
Мне нравится думать, что это довольно гибко. Он не нацелен на конкретную среду вывода, но имеет множество необязательных аргументов, которые вы можете указать, зачем изменять вывод / печать или поведение, а также некоторые постоянные настройки.
Вот расширение для Chrome, которое я написал для решения этой проблемы.
https://chrome.google.com/webstore/detail/varmasterpiece/chfhddogiigmfpkcmgfpolalagdcamkl
Я разработал расширение Chrome и плагин jquery , чтобы украсить var_dumps.
Если вы имеете дело с очень большими массивами в 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, где каждая пара ключ-значение находится в отдельной строке?
Я удивлен, что никто не упомянул самый простой (хотя и не очень красивый) код. Если вы просто хотите , чтобы получить читаемый вывод (без цвета или отступа), простой <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
Я предпочитаю отладку из 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 var_dump
и print_r
, поскольку он может правильно идентифицировать рекурсивно ссылочные объекты в сложной структуре объектов. Он также имеет рекурсивный контроль глубины, чтобы избежать неопределенного рекурсивного отображения некоторых специфических переменных.
См: TVarDumper.php
.
Для других альтернативных решений , которые обеспечивают более преимущества по сравнению с var_dump
и print_r
и может поддерживать циклические ссылки, пожалуйста , проверьте: Используя print_r и var_dump с круговой ссылкой .
Дополнительные идеи см. Также: Как отлаживать сценарии PHP?
Мой, более простой, для меня у меня мало знаний / времени, чтобы изменить инфраструктуру, установить 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
Мне пришлось добавить здесь еще один ответ, потому что я действительно не хотел повторять шаги в других решениях. Это очень просто и не требует расширений, включает и т. Д., И это то, что я предпочитаю. Это очень просто и очень быстро.
Сначала просто json_encode рассматриваемую переменную:
echo json_encode($theResult);
Скопируйте полученный результат в редактор JSON по адресу http://jsoneditoronline.org/, просто скопируйте его в левую панель, нажмите « Копировать»>, и он распечатает JSON в действительно красивом древовидном формате.
Каждому свое, но, надеюсь, это поможет другим получить еще один хороший вариант! :)