var_dump의 결과를 문자열로 캡처하려면 어떻게해야합니까?


605

var_dump문자열 의 출력을 캡처하고 싶습니다 .

PHP 문서는 말합니다;

결과를 브라우저에 직접 출력하는 것과 마찬가지로 출력 제어 기능 을 사용하여이 기능의 출력을 캡처하고이를 문자열로 저장할 수 있습니다 (예 :).

그것이 어떻게 작동하는지에 대한 예는 무엇입니까?

print_r() 필요한 정보를 제공하지 않기 때문에 유효한 가능성이 아닙니다.

답변:


601

출력 버퍼링을 사용하십시오.

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>

8
출력 버퍼링을 사용하면 성능에 부정적인 영향을 줄 수 있습니다. 복잡한 스크립트를 실행하는 동안 여러 변수를 조사해야하는 경우에도 매우 혼란 스러울 수 있습니다.
selfawaresoup 2009

83
@Inwdr 디버깅을위한 편리한 기능으로 var_dump를 사용한 적이 있으며 프로덕션 코드에 var_dump 문을 남겨 두지 않았습니다. 나는 이것이 전형적인 것이라고 상상한다. 그러한 상황에서는 성능이 전혀 관련이 없을 것입니다.
Mark Amery

를 사용하여 가독성을 위해 태그를 제거하십시오 (문자열을 원할 경우) strip_tags().
Anil

11
이것은 당신이 요청한 것과 똑같이 'var_dump의 결과를 문자열로 캡처'하기 때문에 질문에 대한 좋은 대답입니다. var_export ()는 일반적으로 더 의미가 있기 때문에 더 나은 대답입니다.
Qaribou의 Josh

1
@AlbertHendriks 나는 var_dump를 선호합니다. Xdebug를 사용하면 예쁜 데이터가 표시됩니다.
robsch

880

시험 var_export

체크 아웃하고 싶을 수도 있지만 두 번째 매개 변수를 var_export제공하는 것과 동일한 출력을 제공하지는 않지만 출력하지 않고 출력을 반환합니다.var_dump$return

$debug = var_export($my_var, true);

왜?

이 one-liner를 ob_startand 사용하는 것이 ob_get_clean()좋습니다. 또한 출력은 PHP 코드이기 때문에 조금 더 읽기 쉽습니다.

의 차이 var_dump와는 var_exportvar_export리턴한다 "변수의 구문 분석 문자열 표현" 동안 var_dump단순히 변수에 대한 정보를 덤프합니다. 이것이 실제로 의미하는 것은 var_export유효한 PHP 코드 를 제공 한다는 것입니다 (그러나 특히 리소스를 사용하는 경우 변수에 대한 많은 정보를 제공하지 못할 수 있습니다 ).

데모:

$demo = array(
    "bool" => false,
    "int" => 1,
    "float" => 3.14,
    "string" => "hello world",
    "array" => array(),
    "object" => new stdClass(),
    "resource" => tmpfile(),
    "null" => null,
);

// var_export -- nice, one-liner
$debug_export = var_export($demo, true);

// var_dump
ob_start();
var_dump($demo);
$debug_dump = ob_get_clean();

// print_r -- included for completeness, though not recommended
$debug_printr = print_r($demo, true);

출력의 차이 :

var_export ( $debug_export위 예에서) :

 array (
  'bool' => false,
  'int' => 1,
  'float' => 3.1400000000000001,
  'string' => 'hello world',
  'array' => 
  array (
  ),
  'object' => 
  stdClass::__set_state(array(
  )),
  'resource' => NULL, // Note that this resource pointer is now NULL
  'null' => NULL,
)

var_dump ( $debug_dump위 예에서) :

 array(8) {
  ["bool"]=>
  bool(false)
  ["int"]=>
  int(1)
  ["float"]=>
  float(3.14)
  ["string"]=>
  string(11) "hello world"
  ["array"]=>
  array(0) {
  }
  ["object"]=>
  object(stdClass)#1 (0) {
  }
  ["resource"]=>
  resource(4) of type (stream)
  ["null"]=>
  NULL
}

print_r ( $debug_printr위 예에서) :

Array
(
    [bool] => 
    [int] => 1
    [float] => 3.14
    [string] => hello world
    [array] => Array
        (
        )

    [object] => stdClass Object
        (
        )

    [resource] => Resource id #4
    [null] => 
)

주의 사항 : var_export순환 참조를 처리하지 않습니다

순환 참조가있는 변수를 덤프하려고하면 호출 var_export하면 PHP 경고가 발생합니다.

 $circular = array();
 $circular['self'] =& $circular;
 var_export($circular);

결과 :

 Warning: var_export does not handle circular references in example.php on line 3
 array (
   'self' => 
   array (
     'self' => NULL,
   ),
 )

반면에 var_dumpprint_r, 둘 다 *RECURSION*순환 참조가 발생할 때 문자열을 출력합니다 .


11
이것은 허용되는 것보다 확실히 더 나은 대답입니다. 난 더 이상 공언을하지 않는 것이 놀랍습니다! 그가 찾고있는 모든 정보를 제공하지 못하는 이유에 대해 자세히 설명해 주시겠습니까?
JMTyler

7
@JMTyler var_export는 구문 분석 가능한 문자열 (필수적으로 PHP 코드)을 반환하는 반면 var_dump는 원시 데이터 덤프를 제공합니다. 예를 들어, 값이 1 인 정수에서 var_dump를 호출하면 int(1)var_export 가 인쇄 되는 동안 인쇄됩니다 1.
inxilpro 2016 년

4
var_export가 작동하는 동안 $ GLOBALS와 함께 사용하면 var_export가 뱃속에 놓입니다.
Olaf

3
자체에 대한 참조를 포함하는 변수에는 작동하지 않습니다. var_export는 var_dump와 같이 작동하지 않습니다. 이와 같이 $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
hanshenrik

3
사람들을 부르지 마십시오 . var_export브라우저 검색 (int)또는 (문자열)`등 을 수행 할 수 없기 때문에 실제로 디버깅에 더 좋지 않습니다 . 또한 많은 정보를 작은 공간으로 엉망으로 만들면 var_export(''); var_export('\'');됩니다. 그리고 가장 중요한 것은 PHP 치명적 오류 : 중첩 수준이 너무 깊습니다. C : \ path \ file.php에서 75 행
Pacerier

76

당신은 또한 이것을 할 수 있습니다 :

$dump = print_r($variable, true);

17
나는 var_dump를 구체적으로 언급했다 :)
Mark Biek

7
개인적으로 가능한 한 사용하는 것을 선호 print_r하지만 불행히도 때로는 충분한 정보를 제공하지 않습니다. 예를 들어, 그것은 문자열 곳이 할 수있는, 모두 캐스트 이후 falsenull빈 문자열로 보여줍니다. 이들의 차이점에 관심이있는 경우, 나는 var_dump또는에 의지 할 것 var_export입니다.
JMTyler


15
function return_var_dump(){
    // It works like var_dump, but it returns a string instead of printing it.
    $args = func_get_args(); // For <5.3.0 support ...
    ob_start();
    call_user_func_array('var_dump', $args);
    return ob_get_clean();
}

4
@MarkAmery가 사실 인 것 같습니다. 방금 쉬웠어요
hanshenrik

13

또한 echo json_encode($dataobject);도움이 될 수 있습니다


1
이 경우 출력은 매우 혼란스럽고 디버그 목적과는 거리가 멀다고 생각합니다.
토마스 Zato - 분석 재개 모니카

2
Mark Biek은 디버깅에 대해 아무 말도하지 않았습니다. 어쩌면 그는 DB에 저장된 객체 만 필요할 수도 있습니다. 이 경우 제공되는 방법이 잘 작동합니다. 어쨌든 고마워, Tomáš Zato.
ZurabWeb

어쨌든 json_encode모든 데이터 var_dump가 포함 되지는 않습니다 (예를 들어 변수 유형으로). json_encode와 동일한 정보를 print_R다른 형식 으로 출력 합니다.
Tomáš Zato-복원 모니카

1
좋아, 나는 다시 한번 설명 할 것이다 . 구약은 자신의 출력이 필요하다고 언급했다 var_dump. 그는 또한 print_R자신의 요구에 불충분 한 정보를 제공 한다고 밝혔다 . 에서 제공하는 정보에 실제 차이가 없습니다 json_encodeprint_r데이터 만 형식이 다른이 -. 이 print_r점이 충분하지 않으면 json_encode. downvote에 대해 더 이상 불평하지 마십시오. 분명히 무작위 클릭이 아니 었으므로 처리하십시오.
Tomáš Zato-복원 모니카

9

PHP 매뉴얼에서 :

이 함수는 유형과 값을 포함하는 하나 이상의 표현식에 대한 구조화 된 정보를 표시합니다.

다음은 실제로 PHP의 실제 리턴 버전이며 var_dump()가변 길이 인수 목록을 허용합니다.

function var_dump_str()
{
    $argc = func_num_args();
    $argv = func_get_args();

    if ($argc > 0) {
        ob_start();
        call_user_func_array('var_dump', $argv);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }

    return '';
}

1
실제 질문에 대한 실제 답변을 제공하는 +1 var_export, print_r, serialize, json_encode 또는 실제 디버거가 아닌 var_dump가 필요하기 때문에 이것을 읽고 있습니다. 나는 그것들을 사용하는 방법도 알고 있습니다. OP가 var_dump를 요청했습니다. var_dump가 필요합니다. 감사합니다!
슬래시 백

var_dump를 그대로 유지하려면 trigger_error ( "var_dump_str ()에 대한 잘못된 매개 변수 수"); argc <= 0 일 때; 또는 더 나은 방법으로 var_dump를 사용하십시오. : p
hanshenrik

이것은 이미 받아 들여진 대답에 없었던 것을 거의 추가하지 않습니다. $argc@hanshenrik이 지적한 것처럼 여기 의 확인은 불필요하고 틀림없이 부정확하며, 일단 가져 가면 실제로 추가하는 것은 call_user_func_arrayand func_get_args전화입니다.
Mark Amery 12

5

런타임 동안 변수의 내용을 보려면 XDebug와 같은 실제 디버거를 사용하십시오. 그렇게하면 소스 코드를 망칠 필요가 없으며 일반 사용자가 응용 프로그램을 방문하는 동안에도 디버거를 사용할 수 있습니다. 그들은 눈치 채지 못할 것입니다.


5

다음은 함수로서 완벽한 솔루션입니다.

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}

2
var_dump ( "foo", "bar") => string (3) "foo"string (3) "bar"varDumpToString ( "foo", "bar") => 변수가 둘 이상인 경우에는 작동하지 않습니다. string (3) "foo"
hanshenrik

2

이것은 아마도 약간의 주제입니다.

PHP-FPM 컨테이너의 Docker 로그에 이러한 종류의 정보를 쓰는 방법을 찾고 있었고 아래 스 니펫을 생각해 냈습니다. Docker PHP-FPM 사용자가 사용할 수 있다고 확신합니다.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));

1
핸들이 닫히지 않기 때문에 이것은 리소스 누수이므로 장기 실행 데몬 스타일 스크립트에서 문제가 될 수 있습니다. 하지만 시도file_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik

0

정말 좋아 나는 var_dump()'출력 자세한 S와 만족되지 않은 var_export()'s 또는 print_r()그 많은 정보로 제공하지 않았기 때문에 (길이 누락, 예를 들어, 데이터 유형이없는)의 출력.

안전하고 예측 가능한 코드를 작성하려면 빈 문자열과 null을 구분하는 것이 유용한 경우가 있습니다. 또는 1과 true 사이입니다. 또는 null과 false 사이입니다. 출력에 데이터 유형을 원합니다.

도움이되었지만 기존 응답에서 색상이 지정된 출력을 var_dump()사람이 읽을 수있는 출력으로 html 태그가없는 문자열로 변환하고의 모든 세부 정보를 포함 하는 깨끗하고 간단한 솔루션을 찾지 못했습니다 var_dump().

colored var_dump()인 경우 var_dump()html 색상을 추가하기 위해 php의 기본값 을 무시하는 Xdebug가 설치되어 있음을 의미합니다 .

이런 이유로, 나는 내가 필요한 것을 정확하게 제공하는이 작은 변형을 만들었습니다 :

function dbg_var_dump($var)
    {
        ob_start();
        var_dump($var);
        $result = ob_get_clean();
        return strip_tags(strtr($result, ['=&gt;' => '=>']));
    }

아래 멋진 문자열을 반환합니다.

array (size=6)
  'functioncall' => string 'add-time-property' (length=17)
  'listingid' => string '57' (length=2)
  'weekday' => string '0' (length=1)
  'starttime' => string '00:00' (length=5)
  'endtime' => string '00:00' (length=5)
  'price' => string '' (length=0)

그것이 누군가를 돕기를 바랍니다.


-2

에서 http://htmlexplorer.com/2015/01/assign-output-var_dump-print_r-php-variable.html :

var_dump 및 print_r 함수는 브라우저로 직접 출력 할 수 있습니다. 따라서 이러한 함수의 출력은 php의 출력 제어 함수를 사용해야 만 검색 할 수 있습니다. 아래 방법은 출력을 저장하는 데 유용 할 수 있습니다.

function assignVarDumpValueToString($object) {
    ob_start();
    var_dump($object);
    $result = ob_get_clean();
    return $result;
}

ob_get_clean ()은 내부 버퍼에 입력 된 마지막 데이터 만 지울 수 있습니다. 따라서 여러 항목이있는 경우 ob_get_contents 메소드가 유용합니다.

위와 동일한 소스에서 :

function varDumpToErrorLog( $var=null ){
    ob_start();                    // start reading the internal buffer
    var_dump( $var);          
    $grabbed_information = ob_get_contents(); // assigning the internal buffer contents to variable
    ob_end_clean();                // clearing the internal buffer.
    error_log( $grabbed_information);        // saving the information to error_log
}

1
다른 출처에서 자료를 인용 할 때 올바르게 표시하십시오. 편집하려고하기 전에이 답변에서 인용 형식으로 지정된 부분 은 다른 사람의 블로그에서 복사하여 붙여 넣지 않은 부분 입니다.
Mark Amery 12

-2

긴 문자열 : echo($var);대신에 사용하십시오 dump($var);.

객체 또는 배열 :var_dump('<pre>'.json_encode($var).'</pre>);'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.