Разница между var_dump, var_export и print_r


126

В чем разница между var_dump, var_exportи print_r?


14
Иногда проще попросить кого-нибудь понять лучше, чем читать руководства.
Дипак Ламичхане

11
Ответы @Your Common Sense SO часто бывают более четкими, краткими, действенными и в основном всегда легче ссылаться, чем руководство по PHP.
Марк Фокс

Ответы:


194

var_dump предназначен для отладки. var_dumpвсегда печатает результат.

// var_dump(array('', false, 42, array('42')));
array(4) {
  [0]=> string(0) ""
  [1]=> bool(false)
  [2]=> int(42)
  [3]=> array(1) {[0]=>string(2) "42")}
}

print_r также используется для отладки, но не включает тип члена. Это хорошая идея, если вы знаете типы элементов в вашем массиве, но в противном случае можете ввести в заблуждение. print_rпо умолчанию выводит результат, но разрешает возврат в виде строки с использованием необязательного$returnпараметра.

Array (
    [0] =>
    [1] =>
    [2] => 42
    [3] => Array ([0] => 42)
)

var_export печатает действительный код PHP. Полезно, если вы рассчитали некоторые значения и хотите, чтобы результаты были постоянными в другом скрипте. Обратите внимание, чтоvar_exportне может обрабатывать ссылочные циклы / рекурсивные массивы, тогда какvar_dumpиprint_rпроверяйте их. var_exportпо умолчанию выводит результат, но разрешает возврат в виде строки с использованием необязательного$returnпараметра.

array (
  0 => '',
  1 => false,
  2 => 42,
  3 => array (0 => '42',),
)

Лично я считаю, что var_exportэто лучший компромисс краткости и точности.


51
Обратите внимание, что в var_exportсилу своей природы он умрет ужасной рекурсивной смертью, ну, рекурсивными массивами. print_rи var_dump(хотя я не совсем уверен в последнем, поскольку обычно не использую его) не имеет этой проблемы. Так что не надо var_export($_GLOBALS);, например (который содержит самого себя). :)
Pinkgothic

@ftrotter Я всегда думал, что комментарий хорошо объяснит это любопытство, но, пожалуйста, добавил короткую заметку к ответу.
phihag 02

1
Следует добавить, что вы можете заставить print_r () и var_export () возвращать строку вместо ее вывода, в то время как var_dump () не может этого сделать. Кроме того, мне не нравится var_export (), так как это сбивает с толку - если вы попытаетесь экспортировать некоторую неопределенную константу SOMECONST, вы просто получите текстовую строку SOMECONST. Таким образом, он не будет говорить NULL, 0, "", но на самом деле будет предполагать, что это строка (и я полагаю, что тоже выдаст ЗАМЕЧАНИЕ).
userfuser

1
var_export подходит для безопасного представления строки, например, для защиты кавычек / обратной косой черты.
dkellner 06

1
Лично я предпочитаю var_dumpвывод. Жаль, что он не позволяет возвращать вывод в виде строки. Таким образом, я могу понять мнение @ iconoclast в комментарии выше. Но для меня приемлемо выбирать var_exportиз var_dumpэтого варианта использования. Для полноты обратите внимание на этот связанный запрос функции .
Пол ван Левен

3

var_dumpи var_exportотноситесь так (из руководства )

var_export () получает структурированную информацию о данной переменной. Он похож на var_dump () с одним исключением: возвращаемое представление является допустимым кодом PHP.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.