您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
Ready 发布于2013年08月27日 04:32

原创 PHP在函数内unset()静态变量的细节

4 次浏览 读完需要≈ 4 分钟

内容目录

在PHP关于unset()函数的官方说明文档中,有如下一段说明:

如果在函数中unset()一个静态变量,则unset()将销毁此变量及其所有的引用。

并配有对应的具体示例代码,如下:

<?php
function foo() {
    global $a;
    $a++;
    echo "$a\n";
    unset($a);
    //echo $a;	#如果在这里再次输出$a,将会提示该变量未定义
}

foo();
foo();
foo();
?>

上述的例子将输出如下:

1
2
3

对于上述代码,可能许多PHP初学者无法理解:上面不是说,在函数中unset()一个静态变量,就会销毁此变量及其所有引用,为什么3次调用函数foo(),得到的结果却不一样,并且输出结果与没有unset($a);这行代码的输出结果一样,都实现了计算累加。这里应该如何理解呢?

实际上,在PHP中,函数中定义的静态变量,是存放在静态内存区域的,函数中的静态变量可以看作是对该内存地址的一个引用。

因此,上面的代码可以分解为类似如下代码来理解:

<?php
$a;	//变量$a实际在静态内存区域中,除了foo()函数内,其他地方无法直接访问
function foo() {
    global $a;
    $a++;
    echo "$a\n";
    unset($a);
}

foo();
foo();
foo();
?>

这样,我们就可以参考PHP官方文档关于unset()的如下说明来理解了:

unset()官方文档说明

也就是说,在PHP函数内unset()一个静态变量,实际上销毁的是该函数作用域内的局部变量及其引用,静态内存区域的值仍然存在。

注意:由于PHP官方文档的上述说明不易理解,最近PHP官方的说明文档已经作了如下修改:

如果在函数中unset()一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用unset()之前一样的值。

最新版本的PHP unset()函数说明

  • CodePlayer技术交流群1
  • CodePlayer技术交流群2

0 条评论

撰写评论