我刚刚通过php手册阅读了未设置的变量.
php手册说 "unset()破坏了指定的变量"
这个def看起来很完美,直到我遇到静态变量...... "如果一个静态变量在函数内部未设置(),unset()仅在函数的其余部分的上下文中销毁变量.以下调用将恢复之前的变量的值."
至少,这个定义对我来说似乎不是一个好的定义,因为"销毁变量"意味着变量不再与该内存位置相关联.
是否还有其他人认为更好的定义是"unset()使变量超出当前范围"?我的意思是,不是指向终生,而是在这里使用单词范围更好?
Art*_*cto 15
让我们考虑一下这个功能:
function foo() {
static $bar;
$bar++;
unset($bar);
}
foo(); //static $bar is 1
foo(); //static $bar is 2
Run Code Online (Sandbox Code Playgroud)
该函数编译为:
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);
}
Run Code Online (Sandbox Code Playgroud)
当您调用时unset(),您只是销毁您创建的引用,而不是基础值.
我没有确认,但我猜想发生的事情是这样的:
foo()被调用时,所述符号$bar与此相关联的zval,其引用计数被增加至2和参考标志被设置.unset被调用时,有zval的引用计数下降到1,参考标志被清除可能和符号$bar被删除.请参阅参考计数基础知识.
| 归档时间: |
|
| 查看次数: |
14664 次 |
| 最近记录: |