在PHP中unset变量

我刚刚阅读关于unset变量通过PHP手册.

PHP手册说
“unset()破坏指定的变量”

这个def似乎是完美的,直到我碰到静态变量
“如果静态变量在函数中是unset(),那么unset()只会在函数的其余部分的上下文中销毁该变量,下面的调用将恢复变量的前一个值.

这个定义似乎对我来说似乎不错,至少,因为“破坏变量”意味着该变量不再与该内存位置相关联.

有其他人认为更好的定义是“unset()使变量超出当前范围”?我的意思是,而不是指向一生,在这里使用单词范围更好?

让我们考虑一下功能
function foo() {
    static $bar;
    $bar++;
    unset($bar);
}
foo(); //static $bar is 1
foo(); //static $bar is 2

函数编译为:

function name:  foo
number of ops:  11
compiled vars:  !0 = $bar
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   2     0  >   EXT_nop                                                  
   4     1      EXT_STMT                                                 
         2      FETCH_W                      static              $0      'bar'
         3      ASSIGN_REF                                               !0,$0
   5     4      EXT_STMT                                                 
         5      POST_INC                                         ~1      !0
         6      FREE                                                     ~1
   6     7      EXT_STMT                                                 
         8      UNSET_VAR                                                !0
   7     9      EXT_STMT                                                 
        10    > RETURN                                                   null

每个函数调用foo()之前实际存在一个变量,每次调用时,都会获取一个变量,并将其引用分配给$bar.其实这和以前非常相似:

function foo() {
    global $bar;
    $bar++;
    unset($bar);
}

当您调用unset()时,您只会破坏您创建的引用,而不是基础值.

我没有确认,但我猜这是发生的是这样的:

>存储变量(zval)的底层表示,使其引用计数为1.
>当调用foo()时,符号$bar与此zval关联,其引用计数增加到2,并设置引用标志.
>当未设置被调用时,zval的引用计数减少到1,引用标志可能被清除,符号$bar被删除.

reference count basics.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...