Como capturar o resultado de var_dump em uma string?

605

Gostaria de capturar a saída de var_dumpuma string.

A documentação do PHP diz;

Como em qualquer coisa que produz seu resultado diretamente no navegador, as funções de controle de saída podem ser usadas para capturar a saída dessa função e salvá-la em uma string (por exemplo).

Qual seria um exemplo de como isso poderia funcionar?

print_r() não é uma possibilidade válida, porque não vai me dar as informações que eu preciso.

Mark Biek
fonte

Respostas:

601

Use o buffer de saída:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Eran Galperin
fonte
8
O uso do buffer de saída provavelmente terá um efeito negativo no desempenho aqui. Também pode ficar muito confuso se você precisar examinar várias variáveis ​​durante a execução de um script complexo.
Selfwaresoup
83
@Inwdr Eu só usei var_dump como um recurso de conveniência para depuração, e certamente nunca deixei instruções var_dump no código de produção. Eu imagino que isso é típico. Nessas circunstâncias, é improvável que o desempenho seja relevante.
Mark Amery
remova também as tags para facilitar a leitura (se você quiser apenas a string), usando strip_tags(), isso simplesmente retornará o tipo e o valor.
Anil
11
Esta é uma boa resposta literal para a pergunta, pois você está 'capturando o resultado de um var_dump em uma string' exatamente como o que foi perguntado. var_export () é uma resposta melhor em espírito, pois faz mais sentido em geral.
Josh de Qaribou 6/06/2014
1
@AlbertHendriks Prefiro var_dump. Com o Xdebug ativado, você obtém uma bonita exibição de dados.
robsch
880

Tentar var_export

Você pode querer dar uma olhada var_export- embora ele não forneça a mesma saída, var_dumpmas forneça um segundo $returnparâmetro que fará com que ele retorne sua saída em vez de imprimi-la:

$debug = var_export($my_var, true);

Por quê?

Eu prefiro esse one-liner a usar ob_starte ob_get_clean(). Também acho que a saída é um pouco mais fácil de ler, já que é apenas código PHP.

A diferença entre var_dumpe var_exporté que var_exportretorna uma "representação de sequência analisável de uma variável" enquanto var_dumpsimplesmente despeja informações sobre uma variável. O que isso significa na prática é que var_exportfornece código PHP válido (mas pode não fornecer tantas informações sobre a variável, especialmente se você estiver trabalhando com recursos ).

Demo:

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

A diferença na saída:

var_export ( $debug_exportno exemplo acima):

 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_dumpno exemplo acima):

 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_printrno exemplo acima):

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

    [object] => stdClass Object
        (
        )

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

Advertência: var_exportnão lida com referências circulares

Se você estiver tentando despejar uma variável com referências circulares, a chamada var_exportresultará em um aviso do PHP:

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

Resulta em:

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

Ambos var_dumpe print_r, por outro lado, produzirão a string *RECURSION*ao encontrar referências circulares.

inxilpro
fonte
11
Esta é definitivamente uma resposta melhor do que a aceita. Estou surpreso que não tenha mais votos! Você poderia explicar por que ele pode não fornecer todas as informações que ele está procurando?
JMTyler
7
@JMTyler var_export retorna uma string analisável - essencialmente código PHP - enquanto var_dump fornece um despejo bruto dos dados. Portanto, por exemplo, se você chamar var_dump em um número inteiro com o valor 1, ele será impresso int(1)enquanto var_export apenas será impresso 1.
Inxilpro
4
var_export cai de barriga para baixo se você o usa com $ GLOBALS enquanto var_dump funciona.
Olaf
3
não funcionará com variáveis ​​que contenham referências a si mesma. var_export não funciona como var_dump; assim, $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
hanshenrik
3
Pare de exagerar nas pessoas. var_exportnão é realmente melhor para depurar porque você não poderia fazer uma pesquisa navegador para (int)ou (string) `e etc. Ele também mangles um monte de informações em um espaço pequeno, apenas tente: var_export(''); var_export('\'');. E o mais importante, prepare-se para o erro fatal do PHP: Nível de aninhamento muito profundo - dependência recursiva? em C: \ path \ file.php na linha 75
Pacerier 25/03
76

Você também pode fazer isso:

$dump = print_r($variable, true);
Ian P
fonte
17
I mencionou especificamente var_dump embora :)
Mark Biek
7
Pessoalmente, prefiro usar print_ronde posso, mas, infelizmente, às vezes, não fornece informações suficientes. Por exemplo, como é transmitido para a cadeia de caracteres onde pode, ambos falsee são nullexibidos como uma cadeia de caracteres vazia. Nos casos em que me preocupo com a diferença entre eles, recorreria de má vontade a var_dumpou var_export.
JMTyler
15

Você também pode tentar usar a serialize()função Às vezes, é muito útil para fins de depuração.

Sergey Stolyarov
fonte
7
Uma palavra de aviso - se o motivo pelo qual você deseja a saída como uma sequência for error_log, você não deve usar esta solução, pois a saída da serialização pode conter bytes nulos e error_log truncar seqüências contendo bytes nulos .
Mark Amery
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();
}
hanshenrik
fonte
4
@MarkAmery Parece verdade. Eu apenas facilitei.
hanshenrik
13

Também echo json_encode($dataobject);pode ser útil

ZurabWeb
fonte
1
Nesse caso, a saída é muito confusa e longe do objetivo de depuração na minha opinião.
Tomáš Zato - Restabelece Monica
2
Mark Biek não disse nada sobre depuração, disse? Talvez ele só precise de um objeto salvo no banco de dados. Nesse caso, meu método oferecido funcionaria bem. Obrigado pelo aviso, Tomáš Zato.
precisa saber é o seguinte
De qualquer forma, json_encodenão conterá todos os dados var_dump(como tipos de variáveis, por exemplo). json_encodegera as mesmas informações que print_R, inly em formato diferente.
Tomáš Zato - Reinstale Monica
1
Ok, vou explicar mais uma vez . O AT declarou que ele precisa de saída de var_dump. Ele também afirmou que print_Rfornece informações insuficientes para suas necessidades. Não há diferença real nas informações fornecidas por json_encodee print_r- apenas o formato dos dados é diferente. Diante disso, se print_rfor insuficiente, o mesmo será json_encode. Por favor, não reclame mais do voto negativo. Obviamente, não foi apenas um clique aleatório, então lide com isso.
Tomáš Zato - Restabelece Monica
9

No manual do PHP :

Esta função exibe informações estruturadas sobre uma ou mais expressões que incluem seu tipo e valor.

Então, aqui está a versão real de retorno do PHP var_dump(), que realmente aceita uma lista de argumentos de tamanho variável:

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 '';
}
Younis Bensalah
fonte
1
+1 por fornecer a resposta real à pergunta real. Estou lendo isso porque preciso de var_dump, não var_export, print_r, serialize, json_encode ou um depurador real. Eu sei como usá-los também. OP pediu var_dump, eu preciso var_dump. Obrigado!
Slashback
se você quiser permanecer fiel ao var_dump, deverá acionar o erro ("Contagem incorreta de parâmetros para var_dump_str ()"); quando argc <= 0; ou melhor ainda, faça com que var_dump faça isso por você. : p
hanshenrik
Isso adiciona praticamente nada que ainda não estava na resposta aceita. A $argcverificação aqui é desnecessária e indiscutivelmente incorreta, como apontado por @hanshenrik, e depois que você tira isso, tudo o que realmente está adicionando são as chamadas call_user_func_arraye func_get_args.
Mark Amery
5

Se você quiser dar uma olhada no conteúdo de uma variável durante o tempo de execução, considere usar um depurador real como o XDebug. Dessa forma, você não precisa atrapalhar seu código-fonte e pode usar um depurador mesmo enquanto usuários normais visitam seu aplicativo. Eles não vão perceber.

selfawaresoup
fonte
5

Aqui está a solução completa como uma função:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
Khandad Niazi
fonte
2
não funcionará com mais de 1 variável ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik 19/01/14
2

Este tópico talvez seja um pouco estranho.

Eu estava procurando uma maneira de escrever esse tipo de informação no log do Docker do meu contêiner PHP-FPM e criei o snippet abaixo. Tenho certeza de que isso pode ser usado pelos usuários do Docker PHP-FPM.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));
Charlie Vieillard
fonte
1
o identificador nunca é fechado, portanto, há um vazamento de recursos, o que pode ser um problema em scripts de longa duração no estilo daemon. mas tentefile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik
0

Eu realmente gosto var_dump()da saída detalhada e não estava satisfeito com var_export()a print_r()saída, porque não deu tanta informação (por exemplo, tipo de dados ausente, comprimento ausente).

Para escrever código seguro e previsível, às vezes é útil diferenciar entre uma sequência vazia e uma nula. Ou entre um 1 e um verdadeiro. Ou entre um nulo e um falso. Então, eu quero o meu tipo de dados na saída.

Embora útil, não encontrei uma solução limpa e simples nas respostas existentes para converter a saída colorida de var_dump()uma saída legível por humanos em uma string sem as tags html e incluindo todos os detalhes de var_dump().

Note que se você tem um colorido var_dump(), significa que você tem o Xdebug instalado, que substitui o padrão do php var_dump()para adicionar cores html.

Por esse motivo, criei essa pequena variação dando exatamente o que preciso:

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

Retorna a string agradável abaixo:

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)

Espero que ajude alguém.

Wadih M.
fonte
-2

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

As funções var_dump e print_r podem gerar apenas saída diretamente para o navegador. Portanto, a saída dessas funções só pode ser recuperada usando as funções de controle de saída do php. O método abaixo pode ser útil para salvar a saída.

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

ob_get_clean () pode limpar apenas os últimos dados inseridos no buffer interno. Portanto, o método ob_get_contents será útil se você tiver várias entradas.

Da mesma fonte acima:

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
}
Dev C
fonte
1
Indique corretamente quando você está citando material de outra fonte. Antes da edição que estou prestes a fazer, a única parte desta resposta formatada como uma citação é a parte que você não copiou e colou do blog de alguém.
Mark Amery
-2

Long string : basta usar em echo($var);vez de dump($var);.

Objeto ou matriz :var_dump('<pre>'.json_encode($var).'</pre>);'

vuchkov
fonte