php - variable - var_dump>()




Como posso capturar o resultado de var_dump para uma string? (8)

Tente var_export

Você pode querer verificar var_export - embora não forneça a mesma saída que var_dump ele fornece um segundo parâmetro de $return que fará com que ele retorne sua saída em vez de imprimi-lo:

$debug = var_export($my_var, true);

Por quê?

Eu prefiro este one-liner usando ob_start e ob_get_clean() . Eu também acho que a saída é um pouco mais fácil de ler, já que é apenas o código PHP.

A diferença entre var_dump e var_export é que var_export retorna uma "representação de string parsable de uma variável" enquanto var_dump simplesmente despeja informações sobre uma variável. O que isto significa na prática é que var_export lhe dá um código PHP válido (mas pode não lhe dar tanta informação sobre a variável, especialmente se você estiver trabalhando com resources ).

Demonstração:

$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_export no 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_dump no 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_printr no 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_export não manipula referências circulares

Se você está tentando despejar uma variável com referências circulares, chamar var_export resultará 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,
   ),
 )

Tanto o var_dump quanto o print_r , por outro lado, produzirão a string *RECURSION* ao encontrar referências circulares.

Eu gostaria de capturar a saída de var_dump para uma string.

Os docs do PHP dizem;

Como com qualquer coisa que produza 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).

Alguém pode me dar um exemplo de como isso pode funcionar?

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


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

As funções var_dump e print_r só podem ser enviadas diretamente para o navegador. Assim, a saída dessas funções só pode ser recuperada usando as funções de controle de saída do php. Abaixo método 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 () só pode apagar os últimos dados inseridos no buffer interno. Então, 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
}

Isso pode ser um pouco fora do assunto.

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 trecho abaixo. Tenho certeza de que isso pode ser usado por usuários do Docker PHP-FPM.

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

Se você quiser dar uma olhada no conteúdo de variáveis ​​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 quando usuários normais visitam seu aplicativo. Eles não vão notar.


Use o buffer de saída:

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

Você também pode fazer isso:

$dump = print_r($variable, true);

aqui está a solução completa como função.

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

function return_var_dump(){
    //works like var_dump, but 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();
}




var-dump