PHP 变量处理函数

PHP debug_zval_dump() 函数将内部 zval 结构的字符串表示形式转储到输出。

这对于理解或调试 Zend 引擎或 PHP 扩展的实现细节非常有用。

语法

debug_zval_dump(value, values) 

参数

value必需 指定要转储的变量或值。
values可选 指定要转储的更多变量或值。允许使用多个参数。

返回值

没有返回值。

示例:debug_zval_dump()示例

下面的示例显示了debug_zval_dump()函数的用法。

<?php
$var1 = 'Hello';
$var1 .= ' World';
$var2 = $var1;
$var3 = "Hello World";

debug_zval_dump($var1);
debug_zval_dump($var2);
debug_zval_dump($var3);
?> 

上述代码的输出将是:

string(11) "Hello World" refcount(3)
string(11) "Hello World" refcount(3)
string(11) "Hello World" refcount(1) 

了解引用计数

Zend 引擎将引用计数用于两个不同的目的:

  • 使用一种称为"写入时复制"的技术来优化内存使用,其中持有相同值的多个变量指向内存中的相同副本。当任何变量被修改时,它都会指向内存中的新副本,并且原始变量的引用计数减 1。
  • 跟踪已通过引用分配或传递的变量。该引用计数存储在单独的引用 zval 上,指向当前值的 zval。 debug_zval_dump() 当前未显示此附加 zval。

因为 debug_zval_dump() 将其输入作为普通参数,通过值时,将使用写时复制技术来传递它们:在函数调用的生命周期内,引用计数将加一,而不是复制数据。如果函数在接收到参数后修改了参数,则将复制一份;因为它没有,所以它将显示比调用范围多一的引用计数。

参数传递还会阻止 debug_zval_dump() 显示通过引用分配的变量。为了说明这一点,请考虑对上述示例进行稍微修改的版本:

示例:debug_zval_dump() 和通过引用传递的值

在下面的示例中,尽管 $var1、$var2 和$var3 作为引用链接,仅将值传递给 debug_zval_dump()。该值由引用集使用一次,并且在 debug_zval_dump() 内部使用一次,因此显示引用计数为 2。

<?php
$var1 = 'Hello';
$var1 .= ' World';
//指向三个变量为
//对相同值的引用
$var2 =& $var1;
$var3 =& $var1;

debug_zval_dump($var1);
debug_zval_dump($var2);
debug_zval_dump($var3);
?> 

上述代码的输出将是:

string(11) "Hello World" refcount(2)
string(11) "Hello World" refcount(2)
string(11) "Hello World" refcount(2) 

由于引擎针对不同数据类型进行的优化,会产生更多复杂性。某些类型(例如整数)不使用"写入时复制",因此根本不显示引用计数。在其他情况下,引用计数显示内部使用的额外副本,例如当文字字符串或数组存储为代码指令的一部分时。