内容目录
在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()
的如下说明来理解了:
也就是说,在PHP函数内unset()
一个静态变量,实际上销毁的是该函数作用域内的局部变量及其引用,静态内存区域的值仍然存在。
注意:由于PHP官方文档的上述说明不易理解,最近PHP官方的说明文档已经作了如下修改:
如果在函数中unset()
一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用unset()
之前一样的值。
0 条评论
撰写评论