it-swarm.com.de

Eine hübschere/informativere Var_dump-Alternative in PHP?

Jeder anständige PHP Programmierer hat einen print_r oder var_dump Wrapper, den er benutzt, liebt und dem er Tastenkürzel zuweist. Warum werden wir nicht unsere Favoriten teilen.

131
raveren

Ein ganzes Jahr voller Zeit und Arbeit, nachdem ich diese Frage gestellt hatte, habe ich endlich meine Version von var_dump, Kint, geöffnet. Lesen Sie dazu in die Projektseite oder direkt in github .

Hier ist ein Screenshot:

kint

Sorry für den Stecker :)


EDIT: Ich möchte die Kommentatoren nur daran erinnern, dass dies kein Support-Forum ist. Wenn Sie Probleme haben/eine Funktion haben möchten, geben Sie ein Problem ein . Supportanfragen, die Kommentare anfordern, werden zum Löschen vorgemerkt.

66
raveren

Meine bevorzugte Einstellung ist die var_dump-Funktion, wie von der Xdebug-Erweiterung bereitgestellt : Installieren Sie einfach die Erweiterung (einfach sowohl unter Windows als auch unter Linux), und var_dump erhält eine bessere Ausgabe:

  • besser formatieren
    • HTML
    • farben
  • und Sie haben Optionen, um festzulegen, wie viele Informationen angezeigt werden sollen

Und ein kurzer Screenshot:

 xdebug


Und natürlich bringt Xdebug eine Menge anderer nützlicher Dinge mit, wie das Remote-Debugging (d. H. Das grafische Debugging Ihrer Anwendung PHP in Eclipse PDT),, Profiling, ...

44
Pascal MARTIN

Ich habe mein eigenes geschrieben: REF ( demo ):

r() output

Es ist geplant, nur Text zu rendern und Informationen über den Eingabeausdruck anzuzeigen, wie dies bei Kint der Fall ist.

33
nice ass

Hier ist meins, das ich inline benutze, sehr nützlich:

$pretty = function($v='',$c="&nbsp;&nbsp;&nbsp;&nbsp;",$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)?'&lt;NULL&gt;':"<strong>$v</strong>");}return$r;};

echo $pretty($some_variable);
24

Sie suchen nach Krumo (Warning, Chrome-Warnungen für Malware).

Einfach ausgedrückt, Krumo ist 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 allen Variablen PHP anzeigt. 

16
Pekka 웃

Ich liebe Firephp plus firebug

  • Es schreibt die Protokollierungsinformationen mithilfe von Headern aus ...... AJAX. 
  • Gibt Ihnen eine sehr schöne grafische Darstellung der Variablen und Objekte, die Sie protokollieren
  • Kann den Dateinamen und die Zeilennummer anzeigen, in der die einzelnen Protokollanweisungen vorkommen
  • Einfach in Ihrem Projekt zu verwenden, entweder mit einer prozeduralen oder objektorientierten API
9
Johrn

Meine (teilweise) Lösung dafür ist das Hinzufügen einer Funktion wie folgt (mit Google Chrome):

<?
function console_dump($value)
{ 
?>
<script>
    console.log(<? echo json_encode($value); ?>);
</script>
<?
}
?>

Drücken Sie Strg + Umschalttaste + J (öffnet die Konsole), und Sie können dort die JSON-Struktur finden. Noch nützlicher für einen hübschen Ausdruck von JSON-Antworten. 

8
Tim

Ich habe dBug verwendet, das das geniale cfdump-Tag von Coldfusion nachahmt:

http://dbug.ospinto.com/examples.php

8
jClark

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
7
Anthony Scaife

Hier ist mein:

public function varToHtml($var='', $key='') {
     $type = gettype($var);
      $result = '';

      if (in_array($type, array('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;
}
6
Damon

Ich habe vor kurzem eine kostenlose Chrome-Erweiterung entwickelt (work in progress), um meine Var-Dumps ohne Bibliotheken, ohne Pre-Tags und ohne Installation für jede einzelne App zu verschönern. Alles mit JavaScript und RegEx erledigt. Alles, was Sie tun müssen, ist die Erweiterung zu installieren und Ihr Gut zu gehen. 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:

Example output

5
Alex Naspo

Tracy hat eine schöne reduzierbare Ausgabe mit dump () - Funktion .

2
rikiless

Diese ausgefallenen Bibliotheken sind großartig ... mit Ausnahme des Overheads. Wenn Sie einen einfachen, hübschen var_dump mit unendlichen Parametern benötigen, probieren Sie meine Funktion. Es fügt etwas einfaches HTML hinzu. Datenattribute werden ebenfalls hinzugefügt. Wenn Sie HTML5 verwenden, werden sie von älteren Versionen einfach ignoriert. Das Öffnen der Elemente in der Browserkonsole ist jedoch einfacher, und Sie erhalten ein wenig mehr Informationen, wenn das auf dem Bildschirm angezeigte Bild nicht ausreicht.

Das Layout ist sehr einfach, kein Aufwand. Bietet eine Vielzahl von Informationen für jeden Parameter, einschließlich gettype und sogar class name für Objektdumps (einschließlich XML). Es ist 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 Ihrem CI EXTREM EINFACH hinzu. Gehen Sie zuerst zu application/config/autoload.php und stellen Sie sicher, dass die helper'string' eingeschaltet ist.

$autoload['helper'] = array( 'string' ); 

Dann erstellen Sie einfach eine Datei mit dem Namen MY_string_helper.php in application/helpers und fügen 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 wählen möchten.

Das folgende Snippet ist dasselbe wie oben, nur werden Ihre Variablen in der Browserkonsole angezeigt. Dies kann manchmal das Debuggen von SQL-Objektaufrufen und anderen Array- und Objektaufrufen erleichtern, bei denen der Schlüsselname fehlt oder was auch immer.

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...
<-----------------------------------------------------------------------------------------------------------------------> 
1
SpYk3HH

Um die Liste zu vervollständigen, haben Symfony-Entwickler eine als Standalone-Dumper verwendbare Alternative veröffentlicht:

https://github.com/symfony/var-dumper

Sie können hier mehr darüber lesen:

http://www.sitepoint.com/var_dump-introducing-symfony-vardumper/

1
raveren

Meine bevorzugte ist debug aus https://github.com/hazardland/debug.php . Dies ist eine Bibliothek, die nur einzelne Funktionen enthält, die als debug(Sie können kopieren Sie diese Funktion einfach in Ihr Projekt oder in Ihre Bibliothek). Die typische Ausgabe von debug () html sieht folgendermaßen aus:

 enter image description here

Sie können Daten jedoch auch als Klartext mit derselben Funktion ausgeben (mit vier eingerückten Registerkarten für Leerzeichen) wie folgt (und bei Bedarf sogar in einer Datei protokollieren):

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"
0
BIOHAZARD

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 eine Beispielausgabe: http://langpavel.php5.cz/debug_sample.html

0
langpavel

Eine andere Option ist zu

composer require symfony/var-dumper --save-dev

Dann benutzen Sie in Ihrer Datei einfach dump($var) und Sie erhalten eine Ausgabe wie diese enter image description here

0
GardenRouteGold

Noch eine andere selbstgezogene Version:

http://github.com/perchten/neat_html

Ich finde es sehr flexibel. Es zielt nicht auf eine bestimmte Ausgabeumgebung ab, sondern verfügt über eine Reihe optionaler Argumente, in denen Sie festlegen können, warum Ausgabe/Druck oder Verhalten sowie einige permanente Einstellungen geändert werden.

0
Alastair Brayne

PHP Array Beautifier Dieses einfache Tool nimmt eine Array- oder Objektausgabe in PHP (z. B. eine print_r () - Anweisung) und formatiert sie in Farbcodierung, um Ihre Daten problemlos lesen zu können . http://phillihp.com/ toolz/php-array-beautifier/

0

Ich habe eine Chrome Extension und Jquery Plugin entwickelt, um var_dumps zu verschönern 

https://github.com/netfox01/fleX-debug

0
Eissa Soubhi

Hier ist eine Chrome-Erweiterung, die ich geschrieben habe, um dieses Problem zu lösen.

https://chrome.google.com/webstore/detail/varmasterpiece/chfhddogiigmfpkcmgfpolalagdcamkl

0
Rece

Wenn Sie sehr große Arrays in PHP verwenden, kann diese Funktion hilfreich sein:

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;
}

Im Prinzip wird das gesamte Array ausgegeben, in dem sich jedes Element in einer separaten Zeile befindet. Dies ist von Vorteil, wenn Sie die richtigen vollständigen Pfade für bestimmte Elemente 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';

Siehe: Wie exportiert man ein PHP - Array, wobei sich jedes Schlüsselwertpaar in einer separaten Zeile befindet?

0
kenorb

Meins ist einfacher, für mich habe ich nicht viel Wissen/Zeit, um die Infrastruktur zu ändern, xdebug usw. zu installieren.

In anderen Fällen benötigen 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.

da ich jedoch die DevConsole-Umgebung vorziehen möchte, 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
0
Locke