Jeder anständige PHP - Programmierer hat ein print_r
oder var_dump
Wrapper sie verwenden, Liebe und assign Shortcut - Tasten auf, warum wir nicht unsere Lieblinge teilen .
Jeder anständige PHP - Programmierer hat ein print_r
oder var_dump
Wrapper sie verwenden, Liebe und assign Shortcut - Tasten auf, warum wir nicht unsere Lieblinge teilen .
Antworten:
Ein volles Jahr Zeit und Arbeit, nachdem ich dies gefragt habe, habe ich endlich meine Version von var_dump, Kint, als Open-Source-Version bereitgestellt. Lesen Sie darüber auf der Projektseite oder direkt in Github .
Hier ist ein Screenshot:
Entschuldigung für den Stecker :)
BEARBEITEN: Ich möchte die Kommentatoren nur daran erinnern, dass dies kein Support-Forum ist. Wenn Sie Probleme haben oder eine Funktion wünschen, reichen Sie bitte ein Problem ein . Support, der Kommentare anfordert, wird zum Löschen markiert.
Ich bevorzuge die var_dump
Funktion, wie sie von der Xdebug-Erweiterung bereitgestellt wird : Installieren Sie einfach die Erweiterung (einfach, sowohl unter Windows als auch unter Linux) und erhalten Sie var_dump
eine bessere Ausgabe:
Und ein kurzer Screenshot:
Und natürlich bringt Xdebug eine Menge anderer nützlicher Dinge mit, wie Remote-Debugging (dh grafisches Debuggen Ihrer PHP-Anwendung, zum Beispiel in Eclipse PDT) , Profiling, ...
Ich habe mein eigenes geschrieben: REF ( Demo ):
Es ist geplant, nur Text-Rendering hinzuzufügen und Informationen über den Eingabeausdruck anzuzeigen, wie es Kint tut ...
dll
werde ich dieses "Debug" verwenden. Danke und gute Arbeit!
Hier ist meine, die ich inline benutze, sehr nützlich:
$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);
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 ist eine sehr ausführliche Funktion, die alle PHP-Randfälle (von denen es LOTS gibt) behandelt und zu 100% stabil ist, obwohl sie nicht so lesbar ist. Aber am Ende des Tages, wenn Sie feststellen, dass Ihre Implementierung für Sie am besten ist, sollten Sie sie auf jeden Fall verwenden.
Sie suchen nach Krumo ( Warnung, Chrome-Warnungen für Malware ).
Einfach ausgedrückt ist Krumo ein Ersatz für print_r () und var_dump (). Per Definition ist Krumo ein Debugging-Tool (zunächst für PHP4 / PHP5, jetzt nur für PHP5), das strukturierte Informationen zu jeder PHP-Variablen anzeigt.
Ich habe dBug verwendet, das Coldfusions fantastisches cfdump
Tag emuliert :
Meine (teilweise) Lösung hierfür ist das einfache Hinzufügen einer solchen Funktion (mit Google Chrome):
<?
function console_dump($value)
{
?>
<script>
console.log(<? echo json_encode($value); ?>);
</script>
<?
}
?>
Drücken Sie Strg + Umschalt + J (öffnet die Konsole) und Sie finden dort die JSON-Struktur. Noch nützlicher für einen hübschen Ausdruck von JSON-Antworten.
Ein vollständiges Beispiel für das, was ich benutze ...
<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>
Ausgänge ...
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
Hier ist mein:
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;
}
}
Gestylt mit:
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;
}
sbwDebug
Klasse erstellen, die er vergessen hat zu posten, und die Funktion darin einfügen .
Ich habe kürzlich eine kostenlose Chrome-Erweiterung (in Arbeit) entwickelt, um meine Var-Dumps ohne Bibliotheken, ohne Pre-Tags und ohne Installation für jede einzelne App zu verschönern. Alles erledigt mit JavaScript und regEx. Alles was Sie tun müssen, ist die Erweiterung zu installieren und los geht's. Ich arbeite auch an einer Firefox-Version. Hier ist die GitHub-Seite. Ich hoffe, es bald in den Chrome- und Firefox-Webstores verfügbar zu haben!
https://github.com/alexnaspo/var_dumpling
Hier ist eine Beispielausgabe:
Diese schicken Bibliotheken sind großartig ... außer dem Overhead. Wenn Sie einen einfachen, hübschen var_dump möchten, der unendlich viele Parameter akzeptiert, probieren Sie meine Funktion aus. Es fügt einfaches HTML hinzu. Datenattribute werden ebenfalls hinzugefügt. Wenn Sie HTML5 verwenden, werden sie von niedrigeren Versionen einfach ignoriert, aber es ist einfach, Elemente in der Browserkonsole zu öffnen und ein wenig mehr Informationen zu erhalten, wenn das, was Sie auf dem Bildschirm sehen, nicht ausreicht.
Das Layout ist sehr einfach, kein Overhead. Bietet eine Menge Informationen für jeden Parameter, einschließlich Dinge wie gettype
und sogar class
Namen für Objektspeicherauszüge (einschließlich XML). Es hat sich bewährt, ich benutze es seit Jahren.
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;
}
Und wenn Sie Codeigniter verwenden, fügen Sie es auch EXTREM EINFACH zu Ihrem CI hinzu. Gehen Sie zuerst zu application/config/autoload.php
und stellen Sie sicher, dass das eingeschaltet helper
'string'
ist.
$autoload['helper'] = array( 'string' );
Erstellen Sie dann einfach eine Datei mit dem Namen MY_string_helper.php
in application/helpers
und fügen Sie die Funktion einfach in eine typische if
Anweisung zur Existenzprüfung ein.
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
if (!function_exists('preDump')) {
function preDump() {
...
}
}
// DON'T CLOSE PHP
| ODER |, wenn Sie eine andere Richtung einschlagen möchten.
Das folgende Snippet ist das gleiche wie oben, außer dass Ihre Variablen in der Browserkonsole angezeigt werden. Dies kann manchmal das Debuggen von SQL-Objektaufrufen und anderen Array- und Objektaufrufen erleichtern, bei denen der Schlüsselname oder was auch immer fehlt.
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;
}
Funktioniert mit allem!
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...
<----------------------------------------------------------------------------------------------------------------------->
echo '<pre>';var_dump($var);echo '</pre>';
plus Text mit null Wertschöpfung.
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` mit einigen simple html
um ihn herum, kein 0-wertschöpfender Text. lol kik. Wenn es dir nicht gefällt, benutze es nicht. Nur ein Vorschlag.
PHP Array Beautifier Dieses einfache Tool verwendet eine in PHP ausgegebene Array- oder Objektausgabe, z. B. eine print_r () - Anweisung, und formatiert sie in Farbcodierung, um Ihre Daten leicht lesen zu können. http://phillihp.com/toolz/php-array-beautifier/
Noch eine einheimische Version:
http://github.com/perchten/neat_html
Ich denke gerne, dass es ziemlich flexibel ist. Es zielt nicht auf eine bestimmte Ausgabeumgebung ab, verfügt jedoch über eine Reihe optionaler Argumente, mit denen Sie angeben können, warum die Ausgabe / der Druck oder das Verhalten geändert werden sollen, sowie über einige dauerhafte Einstellungen.
Hier ist eine Chrome-Erweiterung, die ich geschrieben habe, um dieses Problem zu lösen.
https://chrome.google.com/webstore/detail/varmasterpiece/chfhddogiigmfpkcmgfpolalagdcamkl
Ich habe eine Chrome-Erweiterung und ein JQuery-Plugin entwickelt , um var_dumps zu verschönern
Wenn Sie mit sehr großen Arrays in PHP arbeiten, kann diese Funktion helfen:
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;
}
Grundsätzlich wird das gesamte Array ausgegeben, wobei sich jedes Element in einer separaten Zeile befindet. Dies ist hilfreich, um die richtigen vollständigen Pfade für bestimmte Elemente zu finden.
Beispielausgabe:
$a = array();
$a[0] = 1;
$a[1] = 2;
$a[2] = array();
$a[2][0] = 'a';
$a[2][1] = 'b';
$a[2][2] = 'c';
Ich bin überrascht, dass niemand den einfachsten (wenn auch nicht sehr hübschen) Code erwähnt hat. Wenn Sie wollen einfach nur eine lesbare Ausgabe (keine Farben oder Vertiefung) zu erhalten, eine einfache <pre>
um ein var_dump
Werk, wie in:
echo "<pre>";
var_dump($myvariable);
echo "</pre>";
Viel geringer kann der Overhead nicht sein!
Ich habe eine kleine Klasse geschrieben, die Krumo ähnelt, aber viel einfacher in die App einzubetten ist.
Hier ist der Link: https://github.com/langpavel/PhpSkelet/blob/master/Classes/Debug.php
Und hier Beispielausgabe: http://langpavel.php5.cz/debug_sample.html
Ich bevorzuge das Debuggen von https://github.com/hazardland/debug.php , einer Bibliothek, die nur eine einzige Funktion enthält, die als Debug bezeichnet wird (Sie können diese Funktion einfach in Ihr Projekt oder in Ihre Bibliothek kopieren) . Die typische HTML-Ausgabe von debug () sieht folgendermaßen aus:
Sie können Daten jedoch auch als einfachen Text mit derselben Funktion (mit 4 durch Leerzeichen eingerückten Registerkarten) wie folgt ausgeben (und sie bei Bedarf sogar in einer Datei anmelden):
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"
Dies ist ein großartiges Tool, das die fehlerhafte PHP-Funktion ersetzen soll var_dump
und print_r
die rekursiv referenzierten Objekte in einer komplexen Objektstruktur korrekt identifizieren kann. Es hat auch eine rekursive Tiefensteuerung, um eine unbestimmte rekursive Anzeige einiger besonderer Variablen zu vermeiden.
Siehe : TVarDumper.php
.
Für andere alternative Lösungen , die mehr Vorteile gegenüber sehen var_dump
und print_r
und kann zirkuläre Verweise unterstützen, überprüfen Sie bitte: Mit print_r und var_dump mit zirkulärer Referenz .
Weitere Ideen finden Sie auch unter: Wie debuggen Sie PHP-Skripte?
Meins ist einfacher, für mich habe ich nicht viel Wissen / Zeit, um die Infrastruktur zu ändern, installiere xdebug usw. usw.
Und in anderen Fällen brauchen Sie zum Beispiel nicht viel für eine einfache WP-Website
Also benutze ich:
highlight_string("\n<?" . var_export($var, true) . "?>\n");
das hilft mir wirklich sehr.
Aber weil ich die DevConsole-Umgebung bevorzuge, verwende ich diese fantastische, aber einfache Funktion:
https://codeinphp.github.io/post/outputting-php-to-browser-console/
Kleiner Tweak:
<?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
Ich musste hier eine weitere Antwort hinzufügen, weil ich die Schritte in den anderen Lösungen nicht wirklich durchgehen wollte. Es ist extrem einfach und erfordert keine Erweiterungen, enthält usw. und ist das, was ich bevorzuge. Es ist sehr einfach und sehr schnell.
Zuerst einfach json_encode die fragliche Variable:
echo json_encode($theResult);
Kopieren Sie das Ergebnis, das Sie erhalten, in den JSON-Editor unter http://jsoneditoronline.org/. Kopieren Sie es einfach in den linken Bereich, klicken Sie auf Kopieren> und es druckt den JSON in einem wirklich schönen Baumformat.
Jedem sein eigenes, aber hoffentlich hilft dies einigen anderen, eine weitere nette Option zu haben! :) :)