values - var_dump php
Usando print_r y var_dump con referencia circular (7)
TVarDumper
TVarDumper está destinado a reemplazar la función con errores de PHP var_dump
e print_r
, ya que puede identificar correctamente los objetos de referencia recursiva en una estructura de objeto complejo. También tiene un control de profundidad recursivo para evitar la visualización recursiva indefinida de algunas variables peculiares.
Verifique TVarDumper.php
:
<?php
/**
* TVarDumper class file
*
* @author Qiang Xue <[email protected]>
* @link http://www.pradosoft.com/
* @copyright Copyright © 2005-2013 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System.Util
*/
/**
* TVarDumper class.
*
* TVarDumper is intended to replace the buggy PHP function var_dump and print_r.
* It can correctly identify the recursively referenced objects in a complex
* object structure. It also has a recursive depth control to avoid indefinite
* recursive display of some peculiar variables.
*
* TVarDumper can be used as follows,
* <code>
* echo TVarDumper::dump($var);
* </code>
*
* @author Qiang Xue <[email protected]>
* @version $Id$
* @package System.Util
* @since 3.0
*/
class TVarDumper
{
private static $_objects;
private static $_output;
private static $_depth;
/**
* Converts a variable into a string representation.
* This method achieves the similar functionality as var_dump and print_r
* but is more robust when handling complex objects such as PRADO controls.
* @param mixed variable to be dumped
* @param integer maximum depth that the dumper should go into the variable. Defaults to 10.
* @return string the string representation of the variable
*/
public static function dump($var,$depth=10,$highlight=false)
{
self::$_output='''';
self::$_objects=array();
self::$_depth=$depth;
self::dumpInternal($var,0);
if($highlight)
{
$result=highlight_string("<?php/n".self::$_output,true);
return preg_replace(''/<//?php<br ///>/'','''',$result,1);
}
else
return self::$_output;
}
private static function dumpInternal($var,$level)
{
switch(gettype($var))
{
case ''boolean'':
self::$_output.=$var?''true'':''false'';
break;
case ''integer'':
self::$_output.="$var";
break;
case ''double'':
self::$_output.="$var";
break;
case ''string'':
self::$_output.="''$var''";
break;
case ''resource'':
self::$_output.=''{resource}'';
break;
case ''NULL'':
self::$_output.="null";
break;
case ''unknown type'':
self::$_output.=''{unknown}'';
break;
case ''array'':
if(self::$_depth<=$level)
self::$_output.=''array(...)'';
else if(empty($var))
self::$_output.=''array()'';
else
{
$keys=array_keys($var);
$spaces=str_repeat('' '',$level*4);
self::$_output.="array/n".$spaces.''('';
foreach($keys as $key)
{
self::$_output.="/n".$spaces." [$key] => ";
self::$_output.=self::dumpInternal($var[$key],$level+1);
}
self::$_output.="/n".$spaces.'')'';
}
break;
case ''object'':
if(($id=array_search($var,self::$_objects,true))!==false)
self::$_output.=get_class($var).''#''.($id+1).''(...)'';
else if(self::$_depth<=$level)
self::$_output.=get_class($var).''(...)'';
else
{
$id=array_push(self::$_objects,$var);
$className=get_class($var);
$members=(array)$var;
$keys=array_keys($members);
$spaces=str_repeat('' '',$level*4);
self::$_output.="$className#$id/n".$spaces.''('';
foreach($keys as $key)
{
$keyDisplay=strtr(trim($key),array("/0"=>'':''));
self::$_output.="/n".$spaces." [$keyDisplay] => ";
self::$_output.=self::dumpInternal($members[$key],$level+1);
}
self::$_output.="/n".$spaces.'')'';
}
break;
}
}
}
XDebug var_dump
Use la extensión de XDebug PHP, y detectará e ignorará las referencias circulares, por ejemplo:
echo xdebug_var_dump($object);
print_r
+ array_slice
Según esta publicación , puede intentar:
print_r(array_slice($desiredArray, 0, 4));
features_var_export
Use la siguiente función, que es parte del módulo Características para Drupal ( features.export.inc
):
/**
* Export var function
*/
function features_var_export($var, $prefix = '''', $init = TRUE, $count = 0) {
if ($count > 50) {
// Recursion depth reached.
return ''...'';
}
if (is_object($var)) {
$output = method_exists($var, ''export'') ? $var->export() : features_var_export((array) $var, '''', FALSE, $count+1);
}
else if (is_array($var)) {
if (empty($var)) {
$output = ''array()'';
}
else {
$output = "array(/n";
foreach ($var as $key => $value) {
// Using normal var_export on the key to ensure correct quoting.
$output .= " " . var_export($key, TRUE) . " => " . features_var_export($value, '' '', FALSE, $count+1) . ",/n";
}
$output .= '')'';
}
}
else if (is_bool($var)) {
$output = $var ? ''TRUE'' : ''FALSE'';
}
else if (is_int($var)) {
$output = intval($var);
}
else if (is_numeric($var)) {
$floatval = floatval($var);
if (is_string($var) && ((string) $floatval !== $var)) {
// Do not convert a string to a number if the string
// representation of that number is not identical to the
// original value.
$output = var_export($var, TRUE);
}
else {
$output = $floatval;
}
}
else if (is_string($var) && strpos($var, "/n") !== FALSE) {
// Replace line breaks in strings with a token for replacement
// at the very end. This protects whitespace in strings from
// unintentional indentation.
$var = str_replace("/n", "***BREAK***", $var);
$output = var_export($var, TRUE);
}
else {
$output = var_export($var, TRUE);
}
if ($prefix) {
$output = str_replace("/n", "/n$prefix", $output);
}
if ($init) {
$output = str_replace("***BREAK***", "/n", $output);
}
return $output;
}
Uso:
echo features_var_export($object);
Publicar por fascículos
Utilice serialize
para volcar el objeto en representación serializada, por ejemplo:
echo serialize($object);
JSON Encode
Use json_encode
para convertirlo a formato JSON, por ejemplo:
echo json_encode($object);
Ver también: prueba si la variable contiene referencias circulares
Estoy usando el framework MVC Symfony , y parece que muchos de los objetos integrados que quiero depurar tienen referencias circulares. Esto hace que sea imposible imprimir las variables con print_r()
o var_dump()
(ya que siguen referencias circulares ad infinitum o hasta que el proceso se quede sin memoria, lo que ocurra primero).
En lugar de escribir mi propio clon print_r
con algo de inteligencia, ¿hay mejores alternativas? Solo deseo poder imprimir una variable (objeto, matriz o escalar), ya sea en un archivo de registro, un encabezado http o la página web en sí.
Editar: para aclarar cuál es el problema, pruebe este código:
<?php
class A
{
public $b;
public $c;
public function __construct()
{
$this->b = new B();
$this->c = new C();
}
}
class B
{
public $a;
public function __construct()
{
$this->a = new A();
}
}
class C
{
}
ini_set(''memory_limit'', ''128M'');
set_time_limit(5);
print_r(new A());
#var_dump(new A());
#var_export(new A());
No funciona con print_r()
, var_dump()
o var_export()
. El mensaje de error es:
Error grave de PHP: tamaño de memoria permitido de 134217728 bytes agotados (intentado asignar 523800 bytes) en print_r_test.php en la línea 10
Estamos utilizando el Framework PRADO y tiene una clase incorporada llamada "TVarDumper" que puede manejar bastante bien tales objetos complejos, incluso puede formatearlo en HTML agradable, incluido. Resaltado de sintaxis. Puedes obtener esa clase de AQUÍ .
Esto pareció hacer el trabajo por mí:
print_r(json_decode(json_encode($value)));
También tuve este problema y lo resolví implementando el método __get () para romper el círculo de referencia. El método __get () se llama DESPUÉS de que no se encuentre un atributo en la declaración de clase. El método __get () también obtiene el nombre del atributo que falta. Al usar esto, puede definir "atributos virtuales" que funcionan de la misma manera que los habituales pero que no son mencionados por la función print_r. Aquí un ejemplo:
public function __get($name)
{
if ($name=="echo") {
return Zend_Registry::get(''textConfig'');
}
}
Doctrine tiene la misma clase de servicio.
Ejemplo de uso:
<?php echo "<pre>"; /Doctrine/Common/Util/Debug::dump($result, 4); echo "</pre>";?>
Puede usar var_export()
.
var_export () no maneja referencias circulares ya que sería casi imposible generar código PHP analizable para eso. Si desea hacer algo con la representación completa de una matriz u objeto, use serializar ().
ACTUALIZACIÓN: Parece que estaba equivocado. Pensé que había usado esta función hace un tiempo para este propósito, pero debe haber sido alguna imaginación borracha.
De esta manera, el único consejo que puedo dar es la instalación de Xdebug .
class Test {
public $obj;
}
$obj = new Test();
$obj->obj = $obj;
print_r($obj);
var_dump($obj);
Salida:
Test Object
(
[obj] => Test Object
*RECURSION*
)
object(Test)[1]
public ''obj'' =>
&object(Test)[1]
Me parece que tanto print_r()
como var_dump()
pueden manejar la recursión sin problemas. Usando PHP 5.3.5 en Windows.
var_export()
no detecta la recursión, lo que da como resultado un error fatal instantáneo:
Fatal error: Nesting level too deep - recursive dependency? in /sandbox/index.php on line 28