你能否建议我展示如何使用zval容器的任何实际例子?我所知道的唯一相关函数是debug_zval_dump
,但我从未真正使用它。
编辑:
我想,跟踪zval容器我可以看到如何优化代码,看看引用如何使用内存。在某些情况下,它似乎可能是有用的工具。肯定存在debug_val_dump
函数存在的一些充分理由。
答案 0 :(得分:11)
每个PHP变量都存储在zval
中,因此您可以看到您的问题没有意义。
debug_val_dump
不是一个经过深思熟虑的功能,因为它难以解释。通过简单地将变量传递给函数,您将更改zval的引用计数。如果你传递一个对debug_val_dump的引用而不通过引用传递它,你将强制一个zval分离,你将总是返回一个zval,引用计数为1,引用标志为clear,如果你通过引用传递它(必须是完成了呼叫时间,这是不推荐的)然后你不能告诉输出,如果它最初是一个引用。
Xdebug有一个更有用的功能,你不传递变量,而是在字符串中传递它的名字。它被称为xdebug_debug_zval
。
除非您正在调试使用引用的代码,并且您想知道有多少变量属于引用集,否则这些函数对您来说可能不是很有用。
为了理解它们,我建议你阅读手册中的reference count basics。
答案 1 :(得分:4)
你无法真正使用php本身的zval。它是一个核心实现细节,不能(通常)从userland php代码访问。
答案 2 :(得分:0)
我可以看到如何优化代码
PHP对按值分配进行了优化。 PHP通过仅在更改时将值复制到新的zval,并最初将新符号指向相同的zval容器来实现此目的。这种机制称为“写入时复制”。 这是一个示例说明:
$a = "new string";
$b =& $a;
// the variable b points to the variable a
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );
// change the string and see that the refcount is reset
$b = 'changed string';
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );
此脚本的输出如下:
a: (refcount=2, is_ref=0)='new string'
b: (refcount=2, is_ref=0)='new string'
a: (refcount=1, is_ref=0)='new string'
b: (refcount=1, is_ref=0)='changed string'
了解更多:php 7 zend认证学习指南