php中的unset变量

php中的unset变量,php,static,unset,Php,Static,Unset,我刚刚通过php手册了解了unset变量 php手册上说 “unset()销毁指定的变量” 这个def看起来很完美,直到我遇到静态变量。。。 “如果静态变量在函数内部为unset(),unset()将仅在函数其余部分的上下文中销毁该变量。以下调用将恢复变量的先前值。” 这个定义对我来说似乎不是一个好定义,至少,因为“销毁变量”意味着变量不再与该内存位置关联 还有人认为更好的定义是“unset()使变量超出当前范围”吗?我的意思是,与其指向生命周期,不如在这里使用单词scope?在函数中,引用静态

我刚刚通过php手册了解了unset变量

php手册上说 “unset()销毁指定的变量”

这个def看起来很完美,直到我遇到静态变量。。。 “如果静态变量在函数内部为unset(),unset()将仅在函数其余部分的上下文中销毁该变量。以下调用将恢复变量的先前值。”

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


还有人认为更好的定义是“unset()使变量超出当前范围”吗?我的意思是,与其指向生命周期,不如在这里使用单词scope?

在函数中,引用静态变量的变量名就是这样。。参考资料。实际上,unset会破坏引用。

unset(self:$somethingstatic);将引发致命错误,因为变量是静态的(始终存在,无法取消设置)

本文档特别涉及函数内部定义的静态变量,请考虑:

function t($stage)
{
  static $shell = 23;
  switch($stage) {
    case 1:
      $shell++;
      break;
    case 2:
      unset($shell);
      break;
    case 3:
      $shell--;
    break;
  }
  echo $shell;
}
因为$shell是一个静态变量,所以它总是在那里(静态的),所以当你提到$shell只是一个引用时——当你取消设置它时,你就是在取消引用(比如取消符号链接)——静态变量仍然在那里(这就是静态的意思)

因此,如果调用上述函数,t(1)将回显24,t(2)将不回显任何内容,t(3)将(正确地)回显23:)

有什么帮助吗?

嗯,
unset()
所做的就是清除与变量名相关的内存

但是,在静态变量的情况下,您可以将发生的事情可视化为将静态变量从函数的作用域中分离出来,并且每次调用函数时,都会自动获得该变量的副本


<> P> >,这意味着如果你<代码> unSETSE/COD>静态变量,你实际上只不过是代码> unSET//St>Tin那个副本,所以当函数被再次调用时,它会接收到一个新的副本。
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 调用
unset()
时,您只是在销毁创建的引用,而不是基础值

我没有确认,但我想发生的是:

  • 变量(zval)的基本表示形式被存储,以便其引用计数为1
  • 调用
    foo()
    时,符号
    $bar
    与此zval关联,其参考计数增加到2,并设置参考标志
  • 调用
    unset
    时,zval的参考计数减少到1,参考标志可能被清除,符号
    $bar
    被删除

请参阅。

如果我没有错,关键是要取消设置静态变量。出于不同的原因,这可能是有用的,此外,这将释放一些内存。例如:

unset($some_static_var_or_property_holding_a_big_object);
虽然我们无法完全做到这一点,但在某些情况下,我们可以做到这一点:

$some_static_var_or_property_holding_a_big_object = null;

这将释放一些内存(我猜),并允许我们销毁一个我们不再需要的对象(我希望我没有离题)。

这不是一个好问题。您可以在PHP邮件列表或其他任何东西中声明这些内容,但它在这里没有任何价值。你希望从答案中得到什么?如果我说是,你满意吗?;)felix,我只是一个初学者,如果你说“是”,这肯定会增强我的信心,如果你说“不”,那么肯定会学到一些东西,但从下一步开始,我会注意到这一点$b=$a+2//这里$a变成了静态变量$a;?我没有告诉你静态变量的意义,在堆上为数据值分配了空间,在堆栈上为引用链接分配了空间。当取消设置引用时,只有本地堆栈空间被破坏/回收/无效。我想说“任何时候你提到$shell只是一个引用:”但是AFAIK..在php内存中,甚至分配给引用??正确的methankz nathan i din,i don’我不知道unset static属性会给出错误如果我只是想象unset()将变量踢出作用域,那么它是否清除与变量相关的内存取决于变量的生存期。好吧,你说的问题是,
static
声明的变量不在函数的范围内,这就是为什么它会在调用之间传递。Otoh,如果你认为它是静态变量的拷贝,那么你就在正确的轨道上。
$some_static_var_or_property_holding_a_big_object = null;