За последние 24 часа нас посетили 22517 программистов и 1202 робота. Сейчас ищут 729 программистов ...

Готовое решение: Альтернатива функции var_dump

Тема в разделе "Решения, алгоритмы", создана пользователем dark-demon, 16 мар 2007.

  1. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    зачастую в процессе отладки бывает необходимо сделать дамп какой-нибудь переменной, чтобы проверить чему же она всё-таки равна. в php есть стандартные функции для этого дела: var_dump и print_r, у которых есть три беды:
    1. вставка их вывода в html режет всё их форматирование и в итоге разобрать где что очень сложно. эту проблему обычно решают обрамлением тегами <pre>, а чтобы не писать их каждый раз пишуть функцию-враппер.
    2. в случае больших массивов бывает сложно найти нужное место, потому как следующий элемент массива будет находиться после всех детей предыдущего. то есть они выводят сразу всё, а не только то, что необходимо.
    3. если вы вставили куда-то вывод переменной, потом отошли на годик другой, вернулись и обнаружили что забыли убрать дамп - бывает довольно сложно найти то место, куда он был вставлен.

    в связи с этим я написал функцию дампа в html файл. посмотреть функцию в действии и сравнить с конкурентами можно здесь: http://dark-demon.jino-net.ru/dumptest/
    там же можно скачать тестовый пакет.

    чтобы также красиво всё отображалось и флип-флопилось, нужно подключить к выводимой страничке скрипт main.js и стиль main.css, либо интегрировать их в ваши скрипты и стили.
    в общем, смотрите index.php - там всё предельно ясно.

    вызывать функцию элементарно:
    Код (Text):
    1. vardump($a);
    или с указанием имени:
    Код (Text):
    1. vardump($a,'$a');
    с интересом выслушаю предложения и пожелания.

    в последней версии добавлено:
    - совместимость с IE
    - отлов рекурсии
    - линки на автораскрытие ветвей (висят на именах переменных)
    - даблклик раскрывает все дочерние ветви, кроме скрытых
    - скрытые ветви на интах, картинках и потоках с дополнительной информацией.
     
  2. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    dark-demon
    неплохая идея но есть большой касяк:
    Когда делаешь дамп часто делаешь параллельно - правку строчки F5, правку строчки F5 правку строчки F5.
    Если тебе надо смотреть на значение где нибудь на 4-м уровне то замаешься каждый раз отщелкивать все. То есть нужно сохранять какие ветви были раскрыты, чтобы после рефреша они опять оказались раскрытыми.

    Второй касяк - это Ctrl+F не будет работать. То есть поиск возможен только визуальный - это тоже не есть гуд. Поле чтоли добавить для поиска. Хотя это уже конечно придирка :). Но первый пункт на мой взгляд просто обязателен.

    p.s. выделяй код тегами [ php ] <? ?> [/php], а вообще молодец :)
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    1. надо подумать...
    2. поиск работает, но только по открытым веткам. иногда это удобно. хотя, наверно, можно прикрутить кнопочку "развернуть всё дерево"...
     
  4. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    это итак понятно :). И удобно это всегда когда просматриваешь боьшие массивы данных с большим разбросом этих самых данных. Если приделывать кнопку то наверное она должны быть поверх всего всегда доступна. Иначе не очень то она и нужна.
     
  5. Mavir

    Mavir Guest

    Для отладки использую класс dBug.
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    А я лично использую сфою функцию
    PHP:
    1. <?
    2. function _debug($var = 'no value', $die = false)
    3. {
    4.     if (in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1', '192.168.0.1')))
    5.     {
    6.         if ($var === true || $var === false){
    7.             echo $var === true ? 'true' : 'false';
    8.             if ($die)
    9.                 die();
    10.             return;
    11.         }
    12.         if (is_array($var) || is_object($var)){
    13.             echo '<pre>'.print_r($var, true).'</pre>';
    14.             if ($die)
    15.                 die();
    16.             return;
    17.         }
    18.         echo htmlspecialchars($var);
    19.         if ($die)
    20.                 die();
    21.         return;
    22.     }
    23. }
    24. ?>
    25.  
    Если данных много, я просто вывожу ту часть, где у меня возможный глюк :)
     
  7. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Всё, финальный релиз ^_^ всех заинтересовавшихся прошу перечитать первый пост.
     
  8. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    определенно, очень удобный и полезный класс
     
  9. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    пара камней в его огород: NULL распознаёт как пустую строку, при выводе не заменяет сущности, простую переменную (не объект, массив или ресурс) выводит без какого-либо оформления.
     
  10. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    да, интересно... единственное, что не понравилось - это "заморочка" с шаблонами, из-за этого тяжело использовать данную разработку. всё-таки автор для себя писал. а лично я предпочитаю print_r ;)
     
  11. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    нет там никаких заморочек... просто положить все шаблоны в папку out в папке со скриптом...
    сегодня выложу всё одним архивом...
     
  12. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    я не просто так в кавычки это слово взял.
    отладочная функция, зачем вообще шаблоны. хотя, на вкус на цвет, как говорится 8)
     
  13. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    PHP:
    1. <?php
    2. echo '<pre>'.print_r($variable, true).'</pre>';
    3. ?>
    И ненадо никаких шаблонов. Удобно и легко читаеться. Прикручивать ещё какие-то шаблоны и классы для дебага... ужос на!
    Представляю всю эту колбасню раскрашенную в небольшой ячейке таблицы которая в центре сайта где-нить :D
     
  14. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    1. не только для дебага. сей "шаблонизатор" - продвинутая замена обычному инклуду.
    2. один раз прикрутить, чтобы потом на всю жизнь забыть про недоразумение print_r, - не такая уж и большая цена.

    представляю как её разопрёт от <pre>...

    кроме <pre> тебе ещё нужно юзать htmlspecialchars, чтобы отображалость то, что в строке, а не то, как это выводится в браузере. да и вообще, информативность у print_r крайне низкая.
     
  15. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    кстати, vardump благодаря нейтральным цветам замечательно подходит к любому дизайну, в отличие от аляповатого dBug :-]
     
  16. Mavir

    Mavir Guest

    Это все меняется с помощью CSS
     
  17. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    ну вот и выбирай, либо править CSS, либо прокручивать темплейты :)
    Кстати, автор dBug сказал, что поправил основные отмеченные мной баги - рекомендую обновить.
     
  18. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Поправил, да не все. Варнинги всё ещё появляются и замены на html-сущности так и не происходит...

    Обновил сабж - теперь тестовый пакет можно скачать одним архивом.
     
  19. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Всегда хватало print_r, выыод читался безо всякого pre простым view_source, нужное место искалось поиском, и забывать убрать print_r после отладки как-то не удавалось забыть - на рабочем месте не бухаем, но даже если и забыли, grep найдет все, что нужно.
    Чорт, неужели я опять что-то делаю не так? ;(
     
  20. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    ключевое слово - "искалось" :) в нескольких тяжёлых дампах приходится усердно искать нужные данные. и при рефреше - всё по новой.

    для этого не обязательно бухать - можно просто отвлечь.

    могу поспорить он найдёт ещё и кучу строк типа:
    Код (Text):
    1. #var_dump($myvariable);
    впрочем, не в этом основная причина - иметь трейсдамп полезно, чтобы можно было тут же посмотреть с какими параметрами была вызвана функция и откуда. не знаю как тебе, а мне в таких случаях удобнее щёлкнуть пару раз мышью, чем переключаться на редактор, добавлять трейсдамп, закачивать на сервер и переключаться обратно. или другой пример: делаешь дамп массива одно из полей которого содержит таймстемп. чтобы узнать дату тебе нужно лезть в сорц и добавлять отдельный вывод для этого таймстемпа. мне же для этого достаточно одного щелчка мышью.
     
  21. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Небольшой оффтоп:
    Интересно, а можно ли как-нибудь в PHP (под локальной сборкой) узнать состояние клавиатуры? ;) Scroll Lock включен - сайт работает в режиме отладки, выключен - все как обычно, а на продуктиве данная функция себя вообще никак не проявляет :D Удобно ведь ;)
     
  22. Anonymous

    Anonymous Guest

    Dagdamor, интересная идея :) можно повесить на хоткеи и яваскриптом ставить куку.
     
  23. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Продолжение небольшого оффтопа:
    Чисто теоретически можно написать модуль для PHP, который получает состояние клавиатуры сервера. Но зачем? Проще в конфиге задавать уровень отладки (именно так я и делаю). А scroll lock у меня индикатор раскладки клавиатуры: не надо его трогать :)
     
  24. Anonymous

    Anonymous Guest

    Тож оффтоп
    Видел класс на PHP через COM обьект выдвигал лоток привода на серваке. ^_^ LOL =)
    Я предпочел Caps - все равно не пользуюсь, и под рукой ближе.
     
  25. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    наткнулся тут на интересное решение: http://www.firephp.org/Demo/
    если в кратце, то оно использует http-заголовки для передачи данных, а специальное расширение для расширения для браузера написанного на движке мозилла смотрит эти заголовки и выводит в специальной панельке.