我刚刚通过 php 手册阅读了有关 unset 变量的内容。
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。
- When
foo()
被称为,符号$bar
与此 zval 相关联,其引用计数增加到 2,并设置引用标志。
- When
unset
被调用时,zval 的引用计数减少到 1,引用标志可能被清除,并且符号$bar
已移除。
See 引用计数基础知识.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)