Bardziej ładna / pouczająca alternatywa Var_dump w PHP? [Zamknięte]
131
Każdy przyzwoity programista PHP ma print_rlub var_dumpwrapper, którego używa, kocha i przypisuje klawisze skrótów, dlaczego nie udostępnimy naszych ulubionych .
po prostu używam echo '<pre>'; print_r ($ var); exit; nawet go nie zamykam. chyba nie jestem przyzwoity
Funky Dude
Edytowałem link, aby wskazywał na github, gdzie kontynuuję rozwój Kinta, a jeśli nadal masz z nim jakieś problemy, daj mi znać w jakikolwiek sposób.
raveren
1
Hej, Kint jest spoko! To właśnie uratowało mi dzień.
István Ujj-Mészáros
2
Dlaczego pytanie, które jest w 100% reklamą programu, jest umieszczane w wersji „tworzę własną var_dump ()”? Pierwszym pytaniem byłoby, dlaczego reklama produktu jest dozwolona jako pytanie.
m3nda
11
Ponieważ stworzyłem narzędzie ponad rok później po zadaniu pytania. Nie wiem, co cię dręczy, stworzyłem dojrzałe narzędzie open source o ponad 10 000 linii i po latach stale je ulepszam. Odpowiedzi udzieliłem na to pytanie - zgodnie z tradycją w SO.
raveren
Odpowiedzi:
71
Cały rok czasu i pracy po tym, jak o to zapytałem, w końcu otworzyłem moją wersję var_dump, Kint. Przeczytaj o tym na stronie projektu lub bezpośrednio na githubie .
Oto zrzut ekranu:
Przepraszam za wtyczkę :)
EDYCJA: Chciałbym tylko przypomnieć komentującym, że to nie jest forum pomocy technicznej, jeśli masz problemy / chcesz skorzystać z funkcji, zgłoś problem . Pomoc prosząca o komentarze zostanie oznaczona do usunięcia.
musiałem zmienić rozmiar czcionki i upiększyć kod CSS, ale fajna robota, podoba mi się ... pochodząca od długoletniego użytkownika
Krumo
1
jakie zmiany wprowadziłeś, jeśli uważasz, że to poprawa, możesz przesłać mi zmiany na [email protected]
raveren
Byłem przyzwyczajony do Krumo i chciałem mniejszych czcionek, a także upiększyłem kod CSS. Nic, co można by nazwać rzeczywistą poprawą, bardziej jak stary nawyk :)
Quamis
Pomysł polegał na tym, że css ma być kompresowane razem z js, aby jak najmniej ingerować w rzeczywisty wynik. Oczywiście zaplanowano też ładne wcięcie generowanego źródła, ale obecnie nie mam czasu poświęcić
Kintowi
2
Na przykład Kint pokazuje chronione i prywatne zmienne, jeśli zrzucisz obiekt, a krumo nie (ponieważ zakładam, że tylko pierwsza używa klas odbicia). Ogólnie rzecz biorąc uważam, że Kint jest lepszy; chociaż musiałem też poprawić css, aby był bardziej użyteczny (ta ogromna czcionka nie działa zbyt dobrze, gdy zrzucam mnóstwo zagnieżdżonych właściwości). Aha, a kod za tym nie jest bałaganem, czego nie można powiedzieć o Krumo (przepraszam autora Krumo!)
Mahn
44
My wolelibyśmy na to var_dumpfunkcja, jak przewiduje rozszerzenie Xdebug : wystarczy zainstalować rozszerzenie (łatwy, zarówno na Windows i Linux) , a var_dumpstaje się lepsze wyjście:
lepsze formatowanie
HTML
zabarwienie
i masz opcje, aby ustawić, ile informacji powinno być wyświetlanych
I szybki zrzut ekranu:
I, oczywiście, Xdebug oferuje mnóstwo innych przydatnych rzeczy, takich jak zdalne debugowanie (tj. Graficzne debugowanie aplikacji PHP, na przykład w Eclipse PDT) , profilowanie, ...
Muszę użyć tej klasy formatowania xdebug na udostępnionym hoście. Czy jest jakiś sposób, aby włączyć to do mojego osobistego projektu?
Anyul Rivas
1
Jeśli nie jesteś administratorem (rootem) swojego serwera, najprawdopodobniej nie będziesz w stanie zainstalować rozszerzenia PHP (nigdy nie widziałem wspólnej usługi hostingowej, która instalowałaby takie rozszerzenie PHP) ; więc nie, nie będziesz mógł używać Xdebug (w każdym razie, instalacja go na serwerze produkcyjnym nie jest generalnie dobrym pomysłem: w końcu jest to rozszerzenie debugujące) ; będziesz musiał wrócić do opartej na PHP implementacji funkcji wyświetlającej zmienne (zobacz inne odpowiedzi)
Pascal MARTIN
1
tak, potrzebowałem tylko, aby klasa wysłała mi jakieś dane wyjściowe, gdy wystąpi błąd.
Uwielbiam tę funkcję - łatwa i przejrzysta, a wspomniałem bardzo łatwo :)
derekdreery
Dzięki. Używam go cały czas. Powinien być naprawdę wbudowany w PHP. Możesz wprowadzić własne formatowanie, używając drugiego parametru. np. echo $ ładne ($ jakaś_zmienna, "-");
Guillermo Phillips,
7
To pięknie łączy wszystkie najgorsze funkcje z print_r, var_dump i var_export. Brak ucieczki HTML, akceptuje tylko jeden parametr, zawiesza się przy rekurencji, nie może zwracać danych wyjściowych, a na dodatek jest całkowicie nieczytelny . Nie chcę być dupkiem, ale komentarze sprawiają, że wydaje mi się to idealne.
raveren
Dziękuję za komentarz @Raveren. Jeśli mógłbyś być bardziej szczegółowy, poprawię swoją odpowiedź.
Guillermo Phillips
2
IMO najlepszym rozwiązaniem pojedynczej linii jest po prostu function pretty(){echo'<pre>';foreach(func_get_args()as $arg){ob_start();var_dump($arg);echo htmlentities(ob_get_clean())."\n#####\n#####\n\n";}die;}. Var_dump jest bardzo rozwlekłą funkcją, obsługuje wszystkie skrajne przypadki PHP (których jest DUŻO) i jest w 100% stabilny, nawet jeśli nie jest tak czytelny. Ale pod koniec dnia, jeśli uznasz, że Twoja implementacja jest dla Ciebie najlepsza, zdecydowanie powinieneś jej użyć.
raveren
16
Szukasz Krumo ( ostrzeżenie, alerty Chrome dotyczące złośliwego oprogramowania ).
Mówiąc prościej, Krumo jest zamiennikiem print_r () i var_dump (). Z definicji Krumo jest narzędziem do debugowania (początkowo dla PHP4 / PHP5, teraz tylko dla PHP5), które wyświetla uporządkowane informacje o każdej zmiennej PHP.
Naciśnij Ctrl + Shift + J (otwiera konsolę), a znajdziesz tam strukturę JSON. Jeszcze bardziej przydatne w przypadku ładnego wydruku odpowiedzi JSON oczywiście.
Właściwie nieźle. Prawdopodobnie zostałby bardziej oceniony, gdybyś pokazał przykład wyniku.
Mawg mówi, że przywróć Monikę
@acSlater Działa dla mnie, wystarczy utworzyć sbwDebugklasę, którą zapomniał opublikować i umieścić w niej funkcję.
Dennis98,
6
Niedawno opracowałem bezpłatne rozszerzenie do Chrome (w toku), aby upiększyć moje zrzuty var bez bibliotek, bez tagów wstępnych i bez instalacji do każdej aplikacji. Wszystko zrobione za pomocą JavaScript i regEx. Wszystko, co musisz zrobić, to zainstalować rozszerzenie i gotowe. Pracuję również nad wersją przeglądarki Firefox. Oto strona GitHub. Mam nadzieję, że wkrótce będzie dostępny w sklepach Chrome i Firefox!
Te wymyślne biblioteki są świetne ... z wyjątkiem kosztów ogólnych. Jeśli potrzebujesz prostego, ładnego var_dump, który przyjmuje nieskończone parametry, wypróbuj moją funkcję. Dodaje prosty kod HTML. Dodawane są również atrybuty danych, jeśli używasz HTML5, niższe wersje po prostu je zignorują, ale ułatwiają otwarcie elementu w konsoli przeglądarki i uzyskanie trochę więcej informacji, jeśli to, co widzisz na ekranie, nie wystarczy.
Układ jest bardzo prosty, bez kosztów. Zawiera mnóstwo informacji dla każdego parametru, w tym takie rzeczy, jak, gettypea nawet classnazwa zrzutów obiektów (w tym XML). To wypróbowane i prawdziwe, używam go od lat.
A jeśli używasz Codeigniter, dodaj go też do swojego CI BARDZO PROSTO. Najpierw przejdź do application/config/autoload.phpi upewnij się, że helper'string'jest włączony.
$autoload['helper'] = array( 'string' );
Następnie po prostu utwórz plik o nazwie wi MY_string_helper.phppo application/helpersprostu wstaw funkcję w typowej ifinstrukcji w celu sprawdzenia istnienia.
<?phpif (!defined('BASEPATH')) exit('No direct script access allowed');
if (!function_exists('preDump')) {
functionpreDump() {
...
}
}
// DON'T CLOSE PHP
| LUB |, jeśli chcesz pójść w innym kierunku.
Poniższy fragment kodu jest taki sam jak powyżej, z tą różnicą, że pokaże Twoje zmienne w konsoli przeglądarki. Czasami może to ułatwić debugowanie wywołań obiektów sql oraz innych wywołań tablic i obiektów, w których brakuje nazwy klucza lub czegokolwiek.
functionconsoleDump() { // 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;
}
Działa ze wszystkim!
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...
<----------------------------------------------------------------------------------------------------------------------->
Dlaczego należy się martwić o pomijalne spadki wydajności narzędzia programistycznego? Ta funkcja dosłownie echo '<pre>';var_dump($var);echo '</pre>';dodaje tekst dodający wartość zerową.
raveren
@Raveren yea z wyjątkiem preDump('value', TRUE, array( 'bob => 'bill' ), (object)array( 'bob => 'bill' )' is quick and easy and gives a nice layout visually in the browser that shows each variable passed in it's own "area" with a type label, thus making debugging quick and easy. And since it's a snippet i keep in my IDE's toolbox, i can recall it with ease on any needed page or while working with any library. But sure, it's just an echo 'pre'; var_dump` z niektórymi simple htmlwokół niego, a nie tekstem dodającym wartość 0. lol kik. Jeśli ci się to nie podoba, nie używaj tego. Tylko sugestia.
SpYk3HH
@Raveren A jeśli ci się podobało ... naprawdę pokochasz moją aktualizację: P
SpYk3HH
1
PHP Array Beautifier To proste narzędzie pobiera tablicę lub obiekt wyjściowy w PHP, taki jak instrukcja print_r () i formatuje ją w kodowaniu kolorami, aby łatwo odczytać dane.
http://phillihp.com/toolz/php-array-beautifier/
Lubię myśleć, że jest dość elastyczny. Nie jest przeznaczony dla określonego środowiska wyjściowego, ale ma kilka opcjonalnych argumentów, które możesz określić, dlaczego zmienić wyjście / wydruk lub zachowanie, a także niektóre trwałe ustawienia.
Zasadniczo zrzuca całą tablicę, w której każdy element znajduje się w osobnym wierszu, co jest korzystne przy znajdowaniu właściwych pełnych ścieżek dla niektórych elementów.
Dziwię się, że nikt nie wspomniał o najłatwiejszym (choć niezbyt ładnym) kodzie. Jeśli chcesz tylko uzyskać czytelny wynik (bez kolorów lub wcięć), prosty <pre>element wokół var_dumpdziała, jak w:
Demo jest zepsute, chociaż kod jest dostępny na GitHub
Mawg mówi, że przywróć Monikę
0
Preferuję debugowanie z https://github.com/hazardland/debug.php, który jest biblioteką zawierającą tylko jedną funkcję o nazwie debug (możesz po prostu skopiować tę funkcję w swoim projekcie lub w swojej bibliotece) . Typowy wynik debug () html wygląda następująco:
Ale możesz wyprowadzać dane jako zwykły tekst z tą samą funkcją (z 4 wcięciami spacjami) w ten sposób (a nawet w razie potrzeby zaloguj się do pliku):
Jest to świetne narzędzie, które ma na celu zastąpienie błędnej funkcji PHP var_dumpi print_rponieważ może poprawnie identyfikować obiekty, do których istnieją odniesienia rekurencyjne w złożonej strukturze obiektów. Posiada również rekurencyjną kontrolę głębokości, aby uniknąć nieokreślonego rekurencyjnego wyświetlania niektórych osobliwych zmiennych.
Musiałem tutaj dodać kolejną odpowiedź, ponieważ tak naprawdę nie chciałem przechodzić przez kroki w innych rozwiązaniach. Jest niezwykle prosty i nie wymaga żadnych rozszerzeń, zawiera itp. I jest tym, co wolę. Jest to bardzo łatwe i bardzo szybkie.
Najpierw po prostu json_encode odpowiednią zmienną:
echo json_encode($theResult);
Skopiuj otrzymany wynik do edytora JSON pod adresem http://jsoneditoronline.org/, po prostu skopiuj go do lewego panelu bocznego, kliknij Kopiuj> i ładnie drukuje JSON w naprawdę ładnym formacie drzewa.
Dla każdego z nich, ale miejmy nadzieję, że pomoże to niektórym innym mieć jeszcze jedną fajną opcję! :)
Odpowiedzi:
Cały rok czasu i pracy po tym, jak o to zapytałem, w końcu otworzyłem moją wersję var_dump, Kint. Przeczytaj o tym na stronie projektu lub bezpośrednio na githubie .
Oto zrzut ekranu:
Przepraszam za wtyczkę :)
EDYCJA: Chciałbym tylko przypomnieć komentującym, że to nie jest forum pomocy technicznej, jeśli masz problemy / chcesz skorzystać z funkcji, zgłoś problem . Pomoc prosząca o komentarze zostanie oznaczona do usunięcia.
źródło
My wolelibyśmy na to
var_dump
funkcja, jak przewiduje rozszerzenie Xdebug : wystarczy zainstalować rozszerzenie (łatwy, zarówno na Windows i Linux) , avar_dump
staje się lepsze wyjście:I szybki zrzut ekranu:
I, oczywiście, Xdebug oferuje mnóstwo innych przydatnych rzeczy, takich jak zdalne debugowanie (tj. Graficzne debugowanie aplikacji PHP, na przykład w Eclipse PDT) , profilowanie, ...
źródło
Napisałem własne: REF ( demo ):
W planach jest dodanie renderowania tylko tekstu i wyświetlanie informacji o wyrażeniu wejściowym, tak jak robi to Kint ...
źródło
dll
, użyję tego "debugowania". Dzięki i niezła robota!Oto moje, którego używam w tekście, bardzo przydatne:
$pretty = function($v='',$c=" ",$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)?'<NULL>':"<strong>$v</strong>");}return$r;}; echo $pretty($some_variable);
źródło
function pretty(){echo'<pre>';foreach(func_get_args()as $arg){ob_start();var_dump($arg);echo htmlentities(ob_get_clean())."\n#####\n#####\n\n";}die;}
. Var_dump jest bardzo rozwlekłą funkcją, obsługuje wszystkie skrajne przypadki PHP (których jest DUŻO) i jest w 100% stabilny, nawet jeśli nie jest tak czytelny. Ale pod koniec dnia, jeśli uznasz, że Twoja implementacja jest dla Ciebie najlepsza, zdecydowanie powinieneś jej użyć.Szukasz Krumo ( ostrzeżenie, alerty Chrome dotyczące złośliwego oprogramowania ).
źródło
Kocham Firephp Plus Firebug
źródło
Używałem programu dBug, który emuluje niesamowity
cfdump
tag Coldfusion :http://dbug.ospinto.com/examples.php
źródło
Moim (częściowym) rozwiązaniem tego jest po prostu dodanie takiej funkcji (przy użyciu przeglądarki Google Chrome):
<? function console_dump($value) { ?> <script> console.log(<? echo json_encode($value); ?>); </script> <? } ?>
Naciśnij Ctrl + Shift + J (otwiera konsolę), a znajdziesz tam strukturę JSON. Jeszcze bardziej przydatne w przypadku ładnego wydruku odpowiedzi JSON oczywiście.
źródło
Kompletny przykład tego, czego używam ...
<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>
Wyjścia ...
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
źródło
Tu jest moje:
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; } }
W stylu:
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; }
źródło
sbwDebug
klasę, którą zapomniał opublikować i umieścić w niej funkcję.Niedawno opracowałem bezpłatne rozszerzenie do Chrome (w toku), aby upiększyć moje zrzuty var bez bibliotek, bez tagów wstępnych i bez instalacji do każdej aplikacji. Wszystko zrobione za pomocą JavaScript i regEx. Wszystko, co musisz zrobić, to zainstalować rozszerzenie i gotowe. Pracuję również nad wersją przeglądarki Firefox. Oto strona GitHub. Mam nadzieję, że wkrótce będzie dostępny w sklepach Chrome i Firefox!
https://github.com/alexnaspo/var_dumpling
Oto przykładowe dane wyjściowe:
źródło
Tracy ma piękne wyjście składanego za pomocą dump () funkcji .
źródło
Te wymyślne biblioteki są świetne ... z wyjątkiem kosztów ogólnych. Jeśli potrzebujesz prostego, ładnego var_dump, który przyjmuje nieskończone parametry, wypróbuj moją funkcję. Dodaje prosty kod HTML. Dodawane są również atrybuty danych, jeśli używasz HTML5, niższe wersje po prostu je zignorują, ale ułatwiają otwarcie elementu w konsoli przeglądarki i uzyskanie trochę więcej informacji, jeśli to, co widzisz na ekranie, nie wystarczy.
Układ jest bardzo prosty, bez kosztów. Zawiera mnóstwo informacji dla każdego parametru, w tym takie rzeczy, jak,
gettype
a nawetclass
nazwa zrzutów obiektów (w tym XML). To wypróbowane i prawdziwe, używam go od lat.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; }
A jeśli używasz Codeigniter, dodaj go też do swojego CI BARDZO PROSTO. Najpierw przejdź do
application/config/autoload.php
i upewnij się, żehelper
'string'
jest włączony.$autoload['helper'] = array( 'string' );
Następnie po prostu utwórz plik o nazwie wi
MY_string_helper.php
poapplication/helpers
prostu wstaw funkcję w typowejif
instrukcji w celu sprawdzenia istnienia.<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); if (!function_exists('preDump')) { function preDump() { ... } } // DON'T CLOSE PHP
| LUB |, jeśli chcesz pójść w innym kierunku.
Poniższy fragment kodu jest taki sam jak powyżej, z tą różnicą, że pokaże Twoje zmienne w konsoli przeglądarki. Czasami może to ułatwić debugowanie wywołań obiektów sql oraz innych wywołań tablic i obiektów, w których brakuje nazwy klucza lub czegokolwiek.
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; }
Działa ze wszystkim!
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... <----------------------------------------------------------------------------------------------------------------------->
źródło
echo '<pre>';var_dump($var);echo '</pre>';
dodaje tekst dodający wartość zerową.preDump('value', TRUE, array( 'bob => 'bill' ), (object)array( 'bob => 'bill' )' is quick and easy and gives a nice layout visually in the browser that shows each variable passed in it's own "area" with a type label, thus making debugging quick and easy. And since it's a snippet i keep in my IDE's toolbox, i can recall it with ease on any needed page or while working with any library. But sure, it's just an
echo 'pre'; var_dump` z niektórymisimple html
wokół niego, a nie tekstem dodającym wartość 0. lol kik. Jeśli ci się to nie podoba, nie używaj tego. Tylko sugestia.PHP Array Beautifier To proste narzędzie pobiera tablicę lub obiekt wyjściowy w PHP, taki jak instrukcja print_r () i formatuje ją w kodowaniu kolorami, aby łatwo odczytać dane. http://phillihp.com/toolz/php-array-beautifier/
źródło
Jeszcze inna wersja domowej roboty:
http://github.com/perchten/neat_html
Lubię myśleć, że jest dość elastyczny. Nie jest przeznaczony dla określonego środowiska wyjściowego, ale ma kilka opcjonalnych argumentów, które możesz określić, dlaczego zmienić wyjście / wydruk lub zachowanie, a także niektóre trwałe ustawienia.
źródło
Oto rozszerzenie chrome, które napisałem, aby rozwiązać ten problem.
https://chrome.google.com/webstore/detail/varmasterpiece/chfhddogiigmfpkcmgfpolalagdcamkl
źródło
Opracowałem rozszerzenie do Chrome i wtyczkę jquery , aby upiększyć var_dumps
https://github.com/netfox01/fleX-debug
źródło
Jeśli masz do czynienia z bardzo dużymi tablicami w PHP, ta funkcja może pomóc:
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; }
Zasadniczo zrzuca całą tablicę, w której każdy element znajduje się w osobnym wierszu, co jest korzystne przy znajdowaniu właściwych pełnych ścieżek dla niektórych elementów.
Przykładowe dane wyjściowe:
$a = array(); $a[0] = 1; $a[1] = 2; $a[2] = array(); $a[2][0] = 'a'; $a[2][1] = 'b'; $a[2][2] = 'c';
Zobacz: Jak wyeksportować tablicę PHP, w której każda para klucz-wartość znajduje się w osobnym wierszu?
źródło
Dziwię się, że nikt nie wspomniał o najłatwiejszym (choć niezbyt ładnym) kodzie. Jeśli chcesz tylko uzyskać czytelny wynik (bez kolorów lub wcięć), prosty
<pre>
element wokółvar_dump
działa, jak w:echo "<pre>"; var_dump($myvariable); echo "</pre>";
Nie można zejść dużo niżej niż to!
źródło
Napisałem małą klasę podobną do Krumo, ale dużo łatwiejszą do osadzenia w aplikacji.
Tutaj jest link: https://github.com/langpavel/PhpSkelet/blob/master/Classes/Debug.php
A tutaj przykładowe wyjście: http://langpavel.php5.cz/debug_sample.html
źródło
Preferuję debugowanie z https://github.com/hazardland/debug.php, który jest biblioteką zawierającą tylko jedną funkcję o nazwie debug (możesz po prostu skopiować tę funkcję w swoim projekcie lub w swojej bibliotece) . Typowy wynik debug () html wygląda następująco:
Ale możesz wyprowadzać dane jako zwykły tekst z tą samą funkcją (z 4 wcięciami spacjami) w ten sposób (a nawet w razie potrzeby zaloguj się do pliku):
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"
źródło
TVarDumper
Jest to świetne narzędzie, które ma na celu zastąpienie błędnej funkcji PHP
var_dump
iprint_r
ponieważ może poprawnie identyfikować obiekty, do których istnieją odniesienia rekurencyjne w złożonej strukturze obiektów. Posiada również rekurencyjną kontrolę głębokości, aby uniknąć nieokreślonego rekurencyjnego wyświetlania niektórych osobliwych zmiennych.Zobacz:
TVarDumper.php
.Dla innych alternatywnych rozwiązań, które zapewnia większą przewagę nad
var_dump
iprint_r
oraz mogą wspierać referencje okrężne, proszę sprawdzić: Korzystanie print_r i var_dump z okrągłym odniesienia .Aby uzyskać więcej pomysłów, zobacz także: Jak debugować skrypty PHP?
źródło
Mój jest prostszy, dla mnie nie mam zbyt dużej wiedzy / czasu na zmianę infrastruktury zainstalować xdebug itp. Itd.
A w innych przypadkach nie potrzebujesz wiele na przykład do prostej witryny WP
Więc używam:
highlight_string("\n<?" . var_export($var, true) . "?>\n");
to naprawdę bardzo mi pomogło.
ale ponieważ wolę środowisko DevConsole, używam tej niesamowitej, ale prostej funkcji:
https://codeinphp.github.io/post/outputting-php-to-browser-console/
Drobne poprawki:
<?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
źródło
Inną opcją jest
composer require symfony/var-dumper --save-dev
Następnie w swoim pliku po prostu używasz,
dump($var)
a otrzymasz takie wyjścieźródło
Musiałem tutaj dodać kolejną odpowiedź, ponieważ tak naprawdę nie chciałem przechodzić przez kroki w innych rozwiązaniach. Jest niezwykle prosty i nie wymaga żadnych rozszerzeń, zawiera itp. I jest tym, co wolę. Jest to bardzo łatwe i bardzo szybkie.
Najpierw po prostu json_encode odpowiednią zmienną:
echo json_encode($theResult);
Skopiuj otrzymany wynik do edytora JSON pod adresem http://jsoneditoronline.org/, po prostu skopiuj go do lewego panelu bocznego, kliknij Kopiuj> i ładnie drukuje JSON w naprawdę ładnym formacie drzewa.
Dla każdego z nich, ale miejmy nadzieję, że pomoże to niektórym innym mieć jeszcze jedną fajną opcję! :)
źródło