PHPでもっと有益な/有益なVar_dumpの代替?


まともなPHPプログラマは、 print_rまたはvar_dumpラッパーを使用しています。ショートカットキーを愛用し、割り当てることができます。




Answers


これを尋ねた後、1年間の時間と労力で、私は最終的に私のバージョンのvar_dumpを公開しました、Kint。 プロジェクトページで 、またはgithubで直接読むことができます

ここにスクリーンショットがあります:

プラグインで申し訳ありません:)

編集:私はちょうどあなたが問題を抱えている/機能をしたい場合は、問題を提出してください、これはサポートフォーラムではない、コメント者を思い出させたいと思います 。 コメントを要求するサポートは、削除のフラグが立てられます。




Xdebug拡張機能で提供されているvar_dump関数が好きです。Windows とLinuxの両方で簡単に拡張機能をインストールするだけvar_dumpはより良い出力を得ます:

  • より良いフォーメーション
    • HTML
  • どのくらいの情報を表示するかを調整するオプションがあります

そして、簡単なスクリーンショット:


そして、もちろん、Xdebugは、リモートデバッグ(例えば、Eclipse PDTでのPHPアプリケーションのグラフィカルなデバッグ) 、プロファイリングなど、他の有用なものをもたらします。




私は自分自身を書いた: REFデモ ):

計画は、テキストのみのレンダリングを追加し、Kintのような入力式に関する情報を表示することです...




ここでは私がインラインで使用する非常に便利なものです:

$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);



あなたはKrumo警告、マルウェアのChrome警告 )を探しています。

簡単に言えば、Krumoはprint_r()とvar_dump()の代わりです。 Krumoは、最初はPHP4 / PHP5のためのデバッグツールであり、PHP5のための構造化された情報を表示します。




私はFirephp plus firebugを愛する

  • それはヘッダーを使ってログ情報を書き出すので、AJAXを壊さない。
  • ログに記録する変数/オブジェクトをグラフィカルに表示します
  • 各ログステートメントが発生するファイル名と行番号を表示できます
  • 手続き型APIまたはオブジェクト指向APIを使用して、プロジェクトで使いやすい



このための私の(部分)解決策は、単にGoogle Chromeを使って次のような関数を追加することです。

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

Ctrl + Shift + J(コンソールを開く)を押すと、そこにJSON構造体があります。 JSONレスポンスのきれいな印刷にさらに便利です。







私が使っているものの完全な例...

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

アウトプット...

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



ここは私です:

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

スタイル付き:

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



私は最近、ライブラリーなし、プレタグなし、各アプリごとのインストールなしで、自分のvarダンプを美しくするために、無料のクロムエクステンション(開発中)を開発しました。 すべてはJavaScriptとregExで完了しました。 あなたがしなければならないことは、エクステンションとあなたの良いことをインストールすることです。 私はFirefoxのバージョンにも取り組んでいます。 ここにGitHubページがあります。 私はすぐにクロムとFirefoxのwebstoresでそれを利用できるようにしたい!

https://github.com/alexnaspo/var_dumpling

次に出力例を示します。







それらのファンシーライブラリは素晴らしいです...オーバーヘッドを除いて。 無限のパラメータをとる単純できれいなvar_dumpが必要な場合は、私の関数を試してみてください。 これは単純なHTMLを追加します。 データ属性も追加されていますが、HTML5を使用する場合、下位バージョンでは無視されますが、ブラウザコンソールで要素を開いて画面に表示された内容が十分でない場合にはさらに情報が表示されます。

レイアウトは非常に簡単でオーバーヘッドはありません。 オブジェクト・ダンプ(XMLを含む)のgettypeclass名などの情報を含む、それぞれのパラメータに関するgettypeな情報を提供します。 それは試したことがあり、私は何年もそれを使ってきました。

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

Codeigniterを使用している場合は、CIを余りにも簡単に追加してください。 まず、 application/config/autoload.phpに行き、 helper 'string'がオンになっていることを確認してください。

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

次に、 application/helpers MY_string_helper.phpという名前のファイルを作成し、存在チェックのために典型的なif文に関数を挿入するだけです。

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
    if (!function_exists('preDump')) {
        function preDump() {
            ...
        }
    }
//  DON'T CLOSE PHP

| OR |、あなたがそれを別の方向にしたいのであれば。

次のスニペットは、ブラウザコンソールで変数を表示する以外は上記と同じです。 これは、時には、SQLのオブジェクト呼び出しや他の配列やオブジェクトの呼び出しをデバッグするのを容易にすることができます。

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

すべての作品!

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









PHP Array Beautifierこの単純なツールは、print_r()のようなPHPの配列やオブジェクトの出力を取り込み、色分けしてデータを簡単に読み込みます。 http://phillihp.com/toolz/php-array-beautifier/




さらに自家製のバージョン:

http://github.com/perchten/neat_html

私はかなりフレキシブルだと思っています。 特定の出力環境を目指すのではなく、出力/印刷や動作を変更する理由と永続的な設定を指定できるオプションの引数があります。










私の好みは、 https://github.com/hazardland/debug.phpからのデバッグでデバッグとして指定された単一の関数のみを含むライブラリです(プロジェクトまたはライブラリ内のその関数をコピーすることができます) 。 典型的なdebug() htmlの出力は次のようになります。

しかし、同じような機能を持つ平易なテキストとしてデータを出力することもできます(必要に応じてファイルに記録することもできます)。

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"



PHPで非常に大きな配列を扱っている場合は、この関数が役立ちます:

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

基本的に、各要素が別々の行にある配列全体をダンプします。これは、特定の要素に対して適切なフルパスを見つけるのに有益です。

出力例:

$a = array();
$a[0] = 1;
$a[1] = 2;
$a[2] = array();
$a[2][0] = 'a';
$a[2][1] = 'b';
$a[2][2] = 'c';

参照: 各キーと値のペアが別々の行にあるPHP配列をエクスポートするには?




私は一番簡単なコード(非常にきれいではない)は誰も言及していないことに驚いています。 読み込み可能な出力(色やインデントなし)を得たいだけの場合は、次のように、単純な<pre> var_dump動作します:

echo "<pre>";
var_dump($myvariable);
echo "</pre>";

これよりはるかに低いオーバーヘッドを得ることはできません!




TVarDumper

これはバグの多いPHP関数var_dumpprint_rを置き換えることを目的とした素晴らしいツールです。複雑なオブジェクト構造の中で再帰的に参照されるオブジェクトを正しく識別できるためです。 また、いくつかの特有の変数の無期限の再帰的な表示を避けるために、再帰的な深さ制御も備えています。

See: TVarDumper.php

var_dumpprint_rよりも利点が多く、循環参照をサポートできる他の代替ソリューションについては、 print_rとvar_dumpを循環参照で使用するを参照してください 。

詳細については、 PHPスクリプトをどのようにデバッグしますか?