时间:2021-07-01 10:21:17 帮助过:3人阅读
当一个变量通过一个常量值建立的时候,一个zval 容器被建立。例如:
$a= 'new string'; ?> |
在上例中, 一个新的符号名“a” 被建立在当前范围内(作用域),并且建立了一个类型为“string”,值为”new string” 的新的变量容器, 这时因为目前还没有个用户建立的引用指向它,所以 “is_ref”默认为false, “refcount” 被设置为1,表示只有一个符号被用于这个变量容器。注意,如果”refcount” 为1,则”is_ref”永远为”false”. 如果你使用 xdebug ,可以通过它开查看响应信息:
Xdebug_debug_zval(‘a’); ?> |
将会显示:
a: (refcount=1, is_ref=0) = ‘new string’ |
下面,赋值给其他变量名,将增加引用计数
$a= 'new string'; $b= $a; xdebug_debug_zval(‘a’); ?> |
将会显示:
a:(refcount =2,is_ref=0) = 'new string' |
这里 refcount 为 2,因为同一个变量容器连接到了符号“a” 和”b”, php 有足够的聪明判断是否在不需要一个实际的变量容器的时候而复制一个,当”refcount”变为0的时候,变量容器将被摧毁, 当连接到变量容器的变量符号离开作用域(比如,函数结束)或者在符号表上调用unset()的时候,”refcount” 将会被减少1, 下面的例子说明了这个:
$a ='new string'; $c =$b = $a; xdebug_debug_zval('a'); unset($b,$c); xdebug_debug_zval('a'); ?> |
将会显示:
a :(refcount = 3,is_ref=0)=’new sring’ a: (refcount=1,is_ref=0) = ‘new string’ |
如果我们现在调用”unset(a);”则变量容器,包括内部的值和类型,将会从内存移出.