Более симпатичная/информативная альтернатива Var_dump в PHP?

У каждого достойного PHP-программиста есть оболочка print_r или var_dump, которую они используют, любят и назначают сочетания клавиш, почему бы нам не поделиться нашими любимыми.

Ответ 1

Целый год времени и труда после того, как я спросил об этом, я наконец-то открыл свою версию var_dump, Kint. Читайте об этом на странице проекта или непосредственно в github.

Вот скриншот:

kint

Простите за пробку :)


РЕДАКТИРОВАТЬ: Я просто хотел бы напомнить комментаторам, что это не форум поддержки, если у вас возникли проблемы/хотите функцию, пожалуйста, сообщите о проблеме. Поддержка запрашивающих комментариев будет помечена для удаления.

Ответ 2

Я предпочитаю функцию var_dump, как предусмотрено расширением Xdebug: просто установите расширение (простое, как на окнах и Linux), а var_dump получает лучший результат:

  • лучшее формирование
    • HTML
    • цвета
  • и у вас есть опции для настройки того, сколько информации должно отображаться.

И быстрый снимок экрана:

xdebug


И, конечно же, Xdebug приносит множество других полезных вещей, таких как удаленная отладка (например, графическая отладка вашего PHP-приложения, например, в Eclipse PDT), профилирование,...

Ответ 3

Я написал свой собственный: REF (демо):

r() output

Планы заключаются в добавлении текстового рендеринга и отображения информации о входном выражении, таком как Kint does...

Ответ 4

Здесь мой, который я использую inline, очень полезен:

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

Ответ 5

Вы ищете Krumo (Предупреждение, предупреждения Chrome для вредоносных программ).

Проще говоря, Krumo является заменой print_r() и var_dump(). По определению, Krumo - это инструмент отладки (первоначально для PHP4/PHP5, теперь только для PHP5), который отображает структурированную информацию о любой переменной PHP.

Ответ 6

Мне нравится Firephp плюс firebug

  • Он записывает информацию о регистрации используя заголовки, поэтому он не разбивается AJAX.
  • Дает вам очень приятный графическое представление переменные/объекты, которые вы регистрируете
  • Может отображать имя файла и номер строки, где происходит каждое выражение журнала
  • Простота использования в вашем проекте либо с процедурным, либо с объектно-ориентированным API

Ответ 8

Мое (частичное) решение для этого - просто добавить такую ​​функцию (используя Google Chrome):

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

Нажмите Ctrl + Shift + J (откроется консоль), и вы можете найти там структуру JSON. Еще более полезно для красивой печати отзывов JSON.

Ответ 9

Полный пример того, что я использую...

<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

Ответ 10

Вот мой:

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

Ответ 11

Недавно я разработал бесплатное расширение chrome (незавершенное производство), чтобы украсить мои дампы var без библиотек, без предварительных тегов и без установки для каждого приложения. Все сделано с использованием JavaScript и regEx. Все, что вам нужно сделать, это установить расширение и ваше преимущество. Я также работаю над версией Firefox. Вот страница GitHub. Я надеюсь, что он будет доступен в хромовых и firefox-магазинах в ближайшее время!

https://github.com/alexnaspo/var_dumpling

Вот пример вывода:

Example output

Ответ 12

Tracy имеет красивый сбрасываемый вывод, используя функция dump().

Ответ 13

Те фантастические библиотеки великолепны... кроме накладных расходов. Если вы хотите простой, довольно 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'.

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

Ответ 16

PHP Array Beautifier Этот простой инструмент принимает вывод массива или объекта в PHP, например инструкцию print_r() и форматирует ее в цветовом кодировании, чтобы легко читать ваши данные. http://phillihp.com/toolz/php-array-beautifier/

Ответ 18

Еще одна домашняя версия:

http://github.com/perchten/neat_html

Мне нравится думать, что это довольно гибко. Он не нацелен на конкретную среду вывода, но содержит множество необязательных аргументов, которые вы можете указать, зачем изменять вывод/печать или поведение, а также некоторые постоянные настройки.

Ответ 20

Я предпочитаю отлаживать https://github.com/hazardland/debug.php, который является библиотекой, содержащей только одну функцию с именем 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"

Ответ 21

Если вы имеете дело с очень большими массивами в 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, где каждая пара значений ключа находится в отдельной строке?

Ответ 22

Мой, более простой, для меня у меня нет много знаний/времени, чтобы изменить инфраструктуру, установить 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

Ответ 23

Другой вариант заключается в

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

Затем в вашем файле вы просто используете dump($var) и в итоге вы получите такой вывод enter image description here

Ответ 24

TVarDumper

Это отличный инструмент, который предназначен для замены багги-функции PHP var_dump и print_r, поскольку он может корректно идентифицировать рекурсивно связанные объекты в сложной структуре объекта. Он также имеет рекурсивный контроль глубины, чтобы избежать неопределенного рекурсивного отображения некоторых особых переменных.

Смотрите: TVarDumper.php.


Для других альтернативных решений, которые обеспечивают больше преимуществ по сравнению с var_dump и print_r и могут поддерживать циклические ссылки, проверьте: Использование print_r и var_dump с круговой ссылкой.


Для получения дополнительных идей также проверьте: Как вы отлаживаете скрипты PHP?

Ответ 25

Я удивлен, что никто не упомянул простейший (хотя и не очень красивый) код. Если вы просто хотите получить удобочитаемый вывод (без цветов или отступов), простейший <pre> вокруг a var_dump работает, как в:

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

Невозможно получить более низкие издержки, чем это!