더 예쁜 / 유익한 Var_dump PHP의 대안?


괜찮은 PHP 프로그래머는 print_r 또는 var_dump 래퍼를 사용하여 단축키를 지정하고 사랑하고 지정 합니다 . 우리가 좋아하는 것을 공유 하지 않으십시오.




Answers


이 질문을 한 후 일 년 내내, 나는 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는 모든 PHP 변수에 대한 구조화 된 정보를 표시하는 디버깅 도구입니다 (초기에는 PHP4 / PHP5, 현재는 PHP5 전용).




나는 방화범 플러스 방화범을 좋아한다.

  • 헤더를 사용하여 로깅 정보를 기록하므로 AJAX가 중단되지 않습니다.
  • 로그하는 변수 / 객체에 대한 아주 멋진 그래픽 표현을 제공합니다.
  • 각 로그 문이 발생하는 곳에 파일 이름과 행 번호를 표시 할 수 있습니다.
  • 프로 시저 또는 객체 지향 API로 프로젝트에서 사용하기 쉽습니다.



이를위한 (부분) 해결책은 단순히 다음과 같은 기능을 추가하는 것입니다 (Google 크롬 사용).

<?
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로 완료됩니다. 확장 프로그램을 설치하면됩니다. 저는 파이어 폭스 버전에서도 작업하고 있습니다. 다음은 GitHub 페이지입니다. 크롬과 파이어 폭스 웹 스토어에서 곧 사용할 수 있기를 바랍니다.

https://github.com/alexnaspo/var_dumpling

다음은 예제 출력입니다.







그 멋진 라이브러리는 훌륭합니다 ... 오버 헤드를 제외하고. 무한한 매개 변수를 사용하는 간단하고 예쁜 var_dump가 필요하다면, my 함수를 사용해보십시오. 그것은 간단한 HTML을 추가합니다. 데이터 속성도 추가됩니다. HTML5를 사용하는 경우 낮은 버전은 무시하지만 브라우저 콘솔에서 요소를 쉽게 열고 화면에 표시되는 내용이 충분하지 않은 경우 조금 더 많은 정보를 얻을 수 있습니다.

레이아웃은 오버 헤드가없고 매우 간단합니다. gettype 및 객체 덤프 (XML 포함)의 class 이름조차도 포함하여 각 매개 변수에 대한 많은 정보를 제공합니다. 그것은 진실이고, 오랫동안 사용해 왔습니다.

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 로 가서 'string' helper 가 켜져 있는지 확인하십시오.

$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 출력은 다음과 같습니다.

그러나 같은 기능을 가진 평범한 텍스트로 데이터를 출력 할 수 있습니다 (4 개의 스페이스 들여 쓰기 탭이 있음). (필요하다면 파일에 기록하십시오) :

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

See : 각 키 - 값 쌍이 별도의 줄에있는 PHP 배열을 내보내는 방법?




나는 아무도 가장 쉬운 (아주 예쁜 것은 아니지만) 코드에 대해서는 언급하지 않았다. 읽을 수있는 출력 (색이나 들여 쓰기 없음)을 얻고 싶다면 다음과 같이 var_dump 주위의 간단한 <pre> 작동합니다.

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

이것보다 훨씬 낮은 오버 헤드를 얻을 수 없습니다!




TVarDumper

버그가있는 PHP 함수 var_dumpprint_r 을 대체 할 수있는 훌륭한 도구입니다. 복잡한 객체 구조에서 재귀 적으로 참조되는 객체를 정확하게 식별 할 수 있기 때문입니다. 또한 특정 변수에 대한 반복적 인 표시를 피하기 위해 재귀 적 깊이 제어 기능을 제공합니다.

참조 : TVarDumper.php .

var_dumpprint_r 보다 많은 이점을 제공하고 순환 참조를 지원할 수있는 다른 대체 솔루션의 경우 순환 참조 와 함께 print_r 및 var_dump 사용을 확인하십시오.

자세한 내용은 다음을 확인하십시오. PHP 스크립트는 어떻게 디버깅합니까?