Есть ли в PHP эквивалент print_r или var_dump, который не отображает результат по умолчанию? - PullRequest
3 голосов
/ 09 февраля 2012

Я часто использую print_r($value, true), чтобы вывести некоторые переменные в операторах журнала, и иногда я забываю установить для второго параметра значение true, что может привести к тому, что вместо результата в операторе журнала будет результат, в большинстве случаев он просто потеряно, но иногда оно даже отображается в браузере пользователя.

Это только что произошло со мной, и внутри графа объектов, где есть некоторые учетные данные и другие вещи, которые вы обычно не хотели бы видеть конечным пользователем. Проблема заключалась в том, что вместо того, чтобы передавать значение true в качестве второго параметра, я почему-то передал значение null 1 год назад. И теперь произошел какой-то сбой системы, из-за которого показывался неправильный вывод.

Что вы делаете, чтобы избежать вывода стековых трасс из-за ошибки программиста? Почему все дамп-функции PHP просто выводят вывод по умолчанию? Ища нашу кодовую базу, я нашел довольно много вызовов print_r без второго параметра, установленного в true.

Я также иногда использую json_encode () для вывода отладки, потому что вывод иногда более лаконичен и удобен для чтения. Есть ли недостатки у этого подхода?

Обычно мы используем какую-то буферизацию вывода, но не везде.

Ответы [ 5 ]

3 голосов
/ 09 февраля 2012

var_export () возвращает строку, если второй аргумент равен true;но не забудьте установить второй аргумент

3 голосов
/ 09 февраля 2012

Почему бы не создать пользовательскую функцию, которая обернет все ваши print_r вызовы?Я использую что-то вроде этого:

function good_print() {
    $log = '';
    foreach(func_get_args() as $arg) $log .= print_r($arg, true);
    return $log;
}

Это экономит время, дает мне лучшую функциональность, плюс мне не нужно беспокоиться о том, «на этот раз я использовал правильный вызов?»

2 голосов
/ 09 февраля 2012

Что вы делаете, чтобы избежать вывода трассировки стека из-за ошибки программиста?

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

Почему все функции дампа PHP просто выводят вывод по умолчанию?

Поскольку это проще всего при разработке .

При поиске по нашей кодовой базе я обнаружил довольно много вызовов print_r без второго параметра, для которого установлено значениеtrue

И вы также нашли много or die('some errormessage); утверждений, также не очень хорошая идея в производстве по очевидным причинам.Ручной код - это иллюстрация, а не рабочий код, но, увы, многие программисты считают его таковым.

Я также иногда использую json_encode () для вывода отладочной информации, поскольку выходные данные иногда более лаконичны и удобны для чтения,Есть ли недостатки в этом подходе?

Может быть, какая-то дополнительная нагрузка, и нет четкого индикатора, который предназначен для отладки (как упоминалось ранее, var_dump - это красный флаг, json_encode - нет).

Обычно мы используем какую-то буферизацию вывода, но не везде.

Я использую ее только в случае крайней необходимости, поэтому почти нигде.

1 голос
/ 09 февраля 2012

В соответствии с инструкциями по PHP для print_r документов , вы можете указать print_r возвращать результаты вместо того, чтобы выводить их со вторым, необязательный параметр bool:

$test = array('var1', 'var2');
$val = print_r($test, TRUE); // won't output anything
echo $val; // output the normal print_r goodness you know and love

ОБНОВЛЕНИЕ

После на самом деле после прочтения вопроса я бы предложил решение @ davethegr8, так что вы и другиевероятно, голосуйте за этот ответ.Еще одна реализация:

function _print_r($val, $return=TRUE)
{
  print_r($val, $return);
}

Наконец, при использовании управляемой тестами разработки происходит забавная вещь: вы не засоряете свой исходный код операторами test debug, потому что вы уже обработали его в ваших юнит-тестах:

0 голосов
/ 09 февраля 2012

Что вы делаете, чтобы избежать вывода трассировки стека из-за ошибки программиста?

Вы можете установить пользовательский метод, который печатает ошибки, только если установлена ​​опция DEBUG.*

и вместо звонка print_r просто позвоните print_log.

Вы также можете взглянуть на Крумо , который является удивительной заменой var_dumpprint_r для структурированного отображения переменных PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...