在php中取消设置变量

Tar*_*run 11 php static unset

我刚刚通过php手册阅读了未设置的变量.

php手册说 "unset()破坏了指定的变量"

这个def看起来很完美,直到我遇到静态变量...... "如果一个静态变量在函数内部未设置(),unset()仅在函数的其余部分的上下文中销毁变量.以下调用将恢复之前的变量的值."

至少,这个定义对我来说似乎不是一个好的定义,因为"销毁变量"意味着变量不再与该内存位置相关联.

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

Art*_*cto 15

让我们考虑一下这个功能:

function foo() {
    static $bar;
    $bar++;
    unset($bar);
}
foo(); //static $bar is 1
foo(); //static $bar is 2
Run Code Online (Sandbox Code Playgroud)

该函数编译为:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 存储变量的基础表示(zval),使其引用计数为1.
  • 当foo()被调用时,所述符号$bar与此相关联的zval,其引用计数被增加至2和参考标志被设置.
  • 当unset被调用时,有zval的引用计数下降到1,参考标志被清除可能和符号$bar被删除.

请参阅参考计数基础知识.

  • @artefactor我很想知道你是如何产生出来的? (3认同)

Zak*_*Zak 9

在函数内部,引用静态变量的变量名只是..引用.实际上,取消设置会破坏参考.