让我们考虑一下这个功能:
function foo() {
static $bar;
$bar++;
unset($bar);
}
foo(); //static $bar is 1
foo(); //static $bar is 2
该函数编译为:
函数名:foo
操作数:11
编译后的变量:!0 = $bar
line # * op fetch ext 返回操作数
-------------------------------------------------- -------------------------------------------
2 0 > EXT_NOP
4 1 EXT_STMT
2 FETCH_W 静态 $0 'bar'
3 ASSIGN_REF !0, $0
5 4 EXT_STMT
5 POST_INC ~1 !0
6 免费 ~1
6 7 EXT_STMT
8 UNSET_VAR !0
7 9 EXT_STMT
10 > 返回空
变量实际上存在于每个函数调用之外,foo()
并且在每次调用时,都会获取它并将对它的引用分配给$bar
. 实际上,它与此非常相似:
function foo() {
global $bar;
$bar++;
unset($bar);
}
当您调用 时unset()
,您只会破坏您创建的引用,而不是基础值。
我没有确认,但我猜会发生这种情况:
- 存储变量的底层表示(zval),使其引用计数为 1。
- 当
foo()
被调用时,符号$bar
与此 zval 相关联,其引用计数增加到 2 并设置引用标志。
- 当
unset
被调用时,zval 的引用计数减少到 1,引用标志可能被清除并且符号$bar
被删除。
请参阅引用计数基础知识。