Różnica między var_dump, var_export i print_r

126

Jaka jest różnica między var_dump, var_exporti print_r?

Manish Trivedi
źródło
14
Czasami łatwiej jest poprosić kogoś o lepsze zrozumienie niż czytanie podręczników.
Deepak Lamichhane
11
Odpowiedzi @Your Common Sense SO są często jaśniejsze, bardziej zwięzłe, wykonalne i zasadniczo zawsze łatwiejsze do odniesienia niż podręcznik PHP.
Mark Fox

Odpowiedzi:

194

var_dump służy do debugowania. var_dumpzawsze wypisuje wynik.

// 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 służy również do debugowania, ale nie zawiera typu elementu członkowskiego. Jest to dobry pomysł, jeśli znasz typy elementów w tablicy, ale w przeciwnym razie może być mylący. print_rDomyślnie drukuje wynik, ale zamiast tego umożliwia zwracanie jako ciąg znaków przy użyciu opcjonalnego$returnparametru.

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

var_export drukuje prawidłowy kod php. Przydatne, jeśli obliczyłeś jakieś wartości i chcesz, aby wyniki były stałą w innym skrypcie. Zauważ, żevar_exportnie obsługuje cykli odwołań / tablic rekurencyjnych, podczas gdyvar_dumpiprint_rsprawdź je. var_exportDomyślnie drukuje wynik, ale zamiast tego umożliwia zwracanie jako ciąg znaków przy użyciu opcjonalnego$returnparametru.

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

Osobiście uważam, że var_exportto najlepszy kompromis zwięzły i precyzyjny.

phihag
źródło
51
Zauważ, że var_exportze względu na swoją naturę, umrze straszną rekurencyjną śmiercią na, no cóż, rekurencyjnych tablicach. print_ri var_dump(choć nie jestem do końca pewien co do drugiego, ponieważ zwykle go nie używam) nie mam tego problemu. Więc nie rób tego var_export($_GLOBALS);na przykład (który zawiera siebie). :)
pinkgothic
@ftrotter Zawsze myślałem, że komentarz dobrze wyjaśni tę ciekawość, ale proszę bardzo, dodałem krótką notatkę do odpowiedzi.
phihag
1
Należy dodać, że można sprawić, by print_r () i var_export () zwracały ciąg znaków zamiast go wyprowadzać, podczas gdy var_dump () nie może tego zrobić. Nie lubię też funkcji var_export (), ponieważ jest to mylące - jeśli spróbujesz wyeksportować jakąś niezdefiniowaną stałą SOMECONST, po prostu otrzymasz ciąg tekstowy „SOMECONST”. Więc nie powie NULL, 0, "", ale faktycznie przyjmie, że jest to ciąg (i przypuszczam, że wyrzuci też POWIADOMIENIE).
userfuser
1
var_export jest dobry do bezpiecznego reprezentowania ciągu znaków, jak ochrona przed cudzysłowami / ukośnikiem odwrotnym.
dkellner
1
Osobiście wolę var_dumpwyjście. Szkoda, że ​​nie pozwala na zwracanie danych wyjściowych w postaci łańcucha. Jako taki mogę odnieść się do sentymentu @ iconoclast w powyższym komentarzu. Ale mając do wyboru var_exportponad var_dumpdla tego przypadku użycia jest do przyjęcia dla mnie. Aby uzyskać kompletność, zanotuj tę powiązaną prośbę o funkcję .
Paul van Leeuwen,
3

var_dumpi var_exportodnosić się w ten sposób (z instrukcji )

var_export () pobiera ustrukturyzowane informacje o danej zmiennej. Jest podobny do var_dump () z jednym wyjątkiem: zwrócona reprezentacja jest poprawnym kodem PHP.

Różnią się one od print_rtego, że var_dumpeksportują więcej informacji, takich jak typ danych i rozmiar elementów.

Nanne
źródło