我正在使用 MVC 框架 Symfony,它似乎有很多我想要的内置对象调试有循环引用。这使得无法使用 print_r()
或 var_dump()
打印变量(因为它们无限地遵循循环引用,或者直到进程耗尽内存,以先到者为准) )。
除了用一些智能编写我自己的 print_r
克隆之外,还有更好的替代方案吗?我只希望能够将变量(对象、数组或标量)打印到日志文件、http 标头或网页本身。
编辑:要澄清问题是什么,请尝试以下代码:
<?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());
它不适用于 print_r()
、var_dump()
或 var_export()
>。错误信息是:
PHP 致命错误:第 10 行 print_r_test.php 中允许的内存大小 134217728 字节已耗尽(尝试分配 523800 字节)
I'm using the MVC framework Symfony, and it seems a lot of the built-in objects I want to debug have circular references. This makes it impossible to print the variables with print_r()
or var_dump()
(since they follow circular references ad infinitum or until the process runs out of memory, whichever comes first).
Instead of writing my own print_r
clone with some intelligence, are there better alternatives out there? I only want to be able to print a variable (object, array or scalar), either to a log file, http header or the web page itself.
Edit: to clarify what the problem is, try this code:
<?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());
It doesn't work with print_r()
, var_dump()
or var_export()
. The error message is:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 523800 bytes) in print_r_test.php on line 10
发布评论
评论(9)
Doctrine 具有相同的服务类。
使用示例:
Doctrine have the same service class.
Example of usage:
我们正在使用 PRADO 框架,它有一个名为“TVarDumper”的内置类,它可以很好地处理此类复杂的对象 - 它甚至可以将其格式化为漂亮的 HTML(包括)。语法突出显示。您可以从此处获取该类。
We are using the PRADO Framework and it has a built in class called "TVarDumper" which can handle such complex objects pretty well - it even can format it in nice HTML incl. Syntax Highlighting. You can get that class from HERE.
TVarDumper
TVarDumper 旨在替换有缺陷的 PHP 函数 < code>var_dump 和
print_r
,因为它可以正确识别复杂对象结构中递归引用的对象。它还具有递归深度控制,以避免某些特殊变量的无限递归显示。检查
TVarDumper.php
:XDebug var_dump
使用 XDebug PHP 扩展,它会检测并忽略循环引用,例如:
print_r
+array_slice
按照此 post,您可以尝试:
features_var_export
使用以下函数,该函数是 Drupal 的功能模块 (
features.export.inc
):用法:
序列化
使用
serialize
以序列化表示形式转储对象,例如:JSON Encode
Use < code>json_encode 将其转换为 JSON 格式,例如:
另请参阅:测试变量是否包含循环引用
TVarDumper
TVarDumper is intended to replace the buggy PHP function
var_dump
andprint_r
, since 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.Check
TVarDumper.php
:XDebug var_dump
Use XDebug PHP extension, and it'll detect and ignore the circular references, e.g.:
print_r
+array_slice
As per this post, you may try:
features_var_export
Use the following function which is part of Features module for Drupal (
features.export.inc
):Usage:
Serialize
Use
serialize
to dump the object in serialized representation, e.g.:JSON Encode
Use
json_encode
to convert it into JSON format, e.g.:See also: Test if variable contains circular references
这似乎为我完成了工作:
This seemed to get the job done for me:
<罢工>
您可以使用
var_export()
。< /罢工>更新: 看来我错了。我以为我不久前使用这个功能就是为了这个目的,但这一定是一些醉酒的想象。
这样,我能给出的唯一建议就是安装 Xdebug。
You could use
var_export()
.UPDATE: Seems like I was wrong. I thought I used this function a while ago for this purpose, but it must have been some drunken imagination.
This way, the only advice I can give is installing Xdebug.
我也遇到了这个问题,我通过实现 __get() 方法来打破参考圈来解决它。在类声明中找不到属性后调用 __get() 方法。 __get() 方法还获取缺失属性的名称。使用它,您可以定义“虚拟属性”,其工作方式与通常的方式相同,但 print_r 函数未提及。这是一个例子:
}
I had this problem too and i solved it by implementing the __get() Method to break the reference circle. The __get() Method is called AFTER an attribute isnt found in the class declaration. The __get() Method also gets the name of the missing attribute. Using this you can define "virtual attributes" that work kind of the same way as usual ones but arent mentioned by the print_r function. Here an example:
}
输出:
在我看来,
print_r()
和var_dump()
都可以毫无问题地处理递归。在 Windows 上使用 PHP 5.3.5。var_export()
不检测递归,这会导致即时致命错误:Output:
It seems to me that both
print_r()
andvar_dump()
can handle recursion with no problems. Using PHP 5.3.5 on Windows.var_export()
does not detect recursion, which results in instant fatal error:Symfony 现在也有 VarDumer 组件:
https://symfony.com/doc/current/components/var_dumper.html
它处理循环引用并支持远程转储服务器。
安装非常简单:
然后你可以使用全局函数
dump
(我想composer的autoload.php已经包含在内):Symfony nowadays also has VarDumer component:
https://symfony.com/doc/current/components/var_dumper.html
It handles circular references and supports remote dump server.
Installation is pretty easy:
Then you can use global function
dump
(I suppose composer's autoload.php is already included):2022年遇到这个,希望这对某人有帮助;
PHP 有一个神奇的方法,您可以在类中实现来清理递归对象:
__debugInfo()
这是您的函数的一个很好的起点:
您还可以在对结果数组使用 unset() 对 $object 进行类型转换后完全删除属性。
Came across this in 2022, hope this helps someone;
PHP has a magic method you could implement into your class to clean up recursive objects:
__debugInfo()
Here's a good starting point for your function:
You could also remove properties entirely after typecasting $object using unset() on the resulting array.