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