¿Cómo puedo capturar el resultado de var_dump en una cadena?

605

Me gustaría capturar la salida de var_dump una cadena.

La documentación de PHP dice;

Al igual que con cualquier cosa que envíe su resultado directamente al navegador, las funciones de control de salida se pueden usar para capturar la salida de esta función y guardarla en una cadena (por ejemplo).

¿Cuál sería un ejemplo de cómo podría funcionar?

print_r() no es una posibilidad válida, porque no me dará la información que necesito.

Mark Biek
fuente

Respuestas:

601

Usar almacenamiento en búfer de salida:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Eran Galperin
fuente
8
El uso de buffer de salida probablemente tendrá un efecto negativo en el rendimiento aquí. También puede volverse realmente desordenado si necesita observar múltiples variables durante la ejecución de un script complejo.
selfawaresoup
83
@Inwdr Solo he usado var_dump como una característica conveniente para la depuración, y ciertamente nunca he dejado declaraciones var_dump en el código de producción. Me imagino que esto es típico. En esas circunstancias, es poco probable que el rendimiento sea relevante.
Mark Amery
también elimine las etiquetas para facilitar la lectura (si solo desea la cadena), usando strip_tags(), esto simplemente devolverá el tipo y el valor.
Anil
11
Esta es una buena respuesta literal a la pregunta, ya que está 'capturando [el resultado] de un var_dump en una cadena' exactamente como se le preguntó. var_export () es una mejor respuesta en espíritu, ya que tiene más sentido en general.
Josh de Qaribou
1
@AlbertHendriks Prefiero var_dump. Con Xdebug habilitado, obtienes una bonita visualización de datos.
robsch
880

Tratar var_export

Es posible que desee verificar var_export, aunque no proporciona la misma salida var_dumpque proporciona un segundo $returnparámetro que hará que devuelva su salida en lugar de imprimirla:

$debug = var_export($my_var, true);

¿Por qué?

Prefiero este one-liner a usar ob_startyob_get_clean() . También encuentro que la salida es un poco más fácil de leer, ya que es solo código PHP.

La diferencia entre var_dumpy var_exportes que var_exportdevuelve una "representación de cadena analizable de una variable" mientras var_dumpsimplemente voltea información sobre una variable. Lo que esto significa en la práctica es que var_exportle brinda un código PHP válido (pero puede que no le brinde tanta información sobre la variable, especialmente si está trabajando con recursos ).

Manifestación:

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

La diferencia en salida:

var_export ( $debug_exporten el ejemplo anterior):

 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_dumpen el ejemplo anterior):

 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_printren el ejemplo anterior):

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

    [object] => stdClass Object
        (
        )

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

Advertencia: var_exportno maneja referencias circulares

Si está intentando volcar una variable con referencias circulares, la llamada var_exportdará como resultado una advertencia de PHP:

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

Resultados en:

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

Ambos var_dumpy print_r, por otro lado, generarán la cadena *RECURSION*al encontrar referencias circulares.

inxilpro
fuente
11
Esta es definitivamente una mejor respuesta que la aceptada. ¡Me sorprende que no tenga más votos a favor! ¿Podría explicar por qué podría no proporcionar toda la información que está buscando?
JMTyler
77
@JMTyler var_export devuelve una cadena analizable , esencialmente código PHP, mientras que var_dump proporciona un volcado sin procesar de los datos. Entonces, por ejemplo, si llama a var_dump en un número entero con el valor de 1, se imprimiría int(1)mientras var_export solo se imprime 1.
inxilpro
44
var_export aterriza en su vientre si lo usa con $ GLOBALS mientras var_dump funciona.
Olaf
3
no funcionará con variables que contengan referencias a sí mismo ... var_export no funciona como var_dump; así, $ v = []; $ v [] = & $ v; var_export ($ v, verdadero); ...
hanshenrik
3
Deja de promocionar a la gente. var_exportNo es realmente mejor para depurar porque no se puede hacer una búsqueda del navegador para (int)o (cadena) y `etc. También mangles una gran cantidad de información en un espacio pequeño, sólo tratar: var_export(''); var_export('\'');. Y lo más importante, prepárate para PHP Error grave : nivel de anidamiento demasiado profundo: ¿dependencia recursiva? en C: \ path \ file.php en la línea 75
Pacerier
76

También puedes hacer esto:

$dump = print_r($variable, true);
Ian P
fuente
17
Sin embargo, mencioné específicamente var_dump :)
Mark Biek
77
Personalmente prefiero usar print_rdonde puedo, pero desafortunadamente a veces no proporciona suficiente información. Por ejemplo, ya que arroja a la cadena donde se pueda, tanto falsey nullmuestran como una cadena vacía. En los casos en que me importa la diferencia entre estos, recurriría a regañadientes a var_dumpo var_export.
JMTyler
15

También puede intentar usar la serialize()función. A veces es muy útil para fines de depuración.

Sergey Stolyarov
fuente
77
Una palabra de advertencia: si la razón por la que desea la salida como una cadena es para error_logél, no debe usar esta solución, ya que la salida de serializar puede contener bytes nulos y error_log truncar cadenas que contienen 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
fuente
44
@ MarkAmery parece cierto. Solo lo hice fácil.
hanshenrik
13

También echo json_encode($dataobject);podría ser útil

ZurabWeb
fuente
1
En este caso, el resultado es muy confuso y, en mi opinión, está muy lejos del propósito de depuración.
Tomáš Zato - Restablece a Mónica el
2
Mark Biek no dijo nada sobre depuración, ¿verdad? Tal vez solo necesita un objeto guardado en el DB. En este caso, mi método ofrecido funcionaría bien. Gracias de todos modos, Tomáš Zato.
ZurabWeb
De todos modos, json_encodeno contendrá todos los datos var_dump(como tipos de variables, por ejemplo). json_encodegenera la misma información que print_R, solo en un formato diferente.
Tomáš Zato - Restablece a Mónica el
1
Ok, lo explicaré una vez más . El AT declaró que necesita una salida de var_dump. También afirmó que print_Rse proporciona información insuficiente para sus necesidades. No existe una diferencia real en la información proporcionada por json_encodey print_r, solo el formato de datos es diferente. Dado esto, siprint_r es insuficiente, también lo es json_encode. Por favor, no te quejes más del voto negativo. Obviamente no fue solo un clic al azar, así que lidia con eso.
Tomáš Zato - Restablece a Mónica el
9

Del manual de PHP :

Esta función muestra información estructurada sobre una o más expresiones que incluye su tipo y valor.

Entonces, aquí está la versión de retorno real de PHP var_dump(), que en realidad acepta una lista de argumentos de longitud variable:

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
fuente
1
+1 por proporcionar la respuesta real a la pregunta real. Estoy leyendo esto porque necesito var_dump, no var_export, print_r, serialize, json_encode o un depurador real. También sé cómo usarlos. OP pidió var_dump, necesito var_dump. ¡Gracias!
Slashback
si desea permanecer fiel a var_dump, debe activar trigger_error ("Conteo de parámetros incorrecto para var_dump_str ()"); cuando argc <= 0; o mejor aún, haga que var_dump lo haga por usted. : p
hanshenrik
Esto agrega prácticamente nada que no estaba ya en la respuesta aceptada. La $argccomprobación aquí es innecesaria y podría decirse que es incorrecta, como lo señaló @hanshenrik, y una vez que la quitas, todo lo que realmente estás agregando son las llamadas call_user_func_arrayy func_get_args.
Mark Amery
5

Si desea ver el contenido de una variable durante el tiempo de ejecución, considere usar un depurador real como XDebug. De esa manera, no necesita estropear su código fuente, y puede usar un depurador incluso mientras los usuarios normales visitan su aplicación. No se darán cuenta.

selfawaresoup
fuente
5

Aquí está la solución completa como una función:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
Khandad Niazi
fuente
2
no funcionará con más de 1 variable ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik
2

Esto tal vez un poco fuera de tema.

Estaba buscando una manera de escribir este tipo de información en el registro de Docker de mi contenedor PHP-FPM y se me ocurrió el fragmento a continuación. Estoy seguro de que los usuarios de Docker PHP-FPM pueden usarlo.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));
Charlie Vieillard
fuente
1
el identificador nunca está cerrado, por lo que esta es una pérdida de recursos, que puede ser un problema en los scripts de estilo demonio de larga ejecución. pero intentefile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik
0

Realmente me gusta var_dump()el resultado detallado y no estaba satisfecho con var_export()el print_r()resultado porque no daba tanta información (por ejemplo, falta el tipo de datos, falta la longitud).

Para escribir código seguro y predecible, a veces es útil diferenciar entre una cadena vacía y una nula. O entre un 1 y un verdadero. O entre un nulo y un falso. Entonces quiero mi tipo de datos en la salida.

Aunque fue útil, no encontré una solución limpia y simple en las respuestas existentes para convertir la salida coloreada de var_dump()una salida legible por humanos en una cadena sin las etiquetas html e incluyendo todos los detalles de var_dump().

Tenga en cuenta que si tiene un color var_dump(), significa que tiene instalado Xdebug que anula el valor predeterminado de php var_dump()para agregar colores html.

Por esa razón, creé esta ligera variación dando exactamente lo que necesito:

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

Devuelve la siguiente cadena agradable:

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 ayude a alguien.

Wadih M.
fuente
-2

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

Las funciones var_dump e print_r solo pueden enviarse directamente al navegador. Por lo tanto, la salida de estas funciones solo se puede recuperar usando las funciones de control de salida de php. El siguiente método puede ser útil para guardar la salida.

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

ob_get_clean () solo puede borrar los últimos datos ingresados ​​en el búfer interno. Por lo tanto, el método ob_get_contents será útil si tiene varias entradas.

De la misma fuente que arriba:

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
fuente
1
Indique correctamente cuándo está citando material de otra fuente. Antes de la edición que estoy a punto de hacer, la única parte de esta respuesta formateada como una cita es la parte que no copió y pegó del blog de alguien.
Mark Amery
-2

Cadena larga : solo use en echo($var);lugar de dump($var);.

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

Vuchkov
fuente