1>unset销毁静态变量的问题
你的例子不能说明“如果在函数中 unset() 一个静态变量,则 unset() 将销毁此变量及其所有的引用。”
unset是这样的:如果在函数内unset一个静态变量,那么unset之后的代码里该变量被销毁,而之前的变量值会被保存下来。
function foo() {
static $a;
$a++;
echo "$a\n";
unset($a);
$a ++;
echo "$a\n";
}
foo();// 第一次调用unset之前$a = 1, unset之后$a = 1
foo();// 第二次调用unset之前$a++ = 1 ++ = 2, unset之后$a = 1
foo();// 第三次调用unset之前$a++ = 1 ++ = 2, unset之后$a = 1
最终数出结果是:
1
1
2
1
3
1
你的例子不能说明“如果在函数中 unset() 一个静态变量,则 unset() 将销毁此变量及其所有的引用。”
unset是这样的:如果在函数内unset一个静态变量,那么unset之后的代码里该变量被销毁,而之前的变量值会被保存下来。
function foo() {
static $a;
$a++;
echo "$a\n";
unset($a);
$a ++;
echo "$a\n";
}
foo();// 第一次调用unset之前$a = 1, unset之后$a = 1
foo();// 第二次调用unset之前$a++ = 1 ++ = 2, unset之后$a = 1
foo();// 第三次调用unset之前$a++ = 1 ++ = 2, unset之后$a = 1
最终数出结果是:
1
1
2
1
3
1
foo();// 第一次调用unset之前$a = 1, unset之后$a = 1
foo();// 第二次调用unset之前$a++ = 1 ++ = 2, unset之后$a = 1
foo();// 第三次调用unset之前$a++ = 2 ++ = 3, unset之后$a = 1
function test_global_ref() {
global $obj;
$obj = &new stdclass; // 上面说了$obj是指向全局变量的引用,但是new stdclass出来的是局部变量,它引用的内容很可能就被销毁了。
}3>cal_user_func与call_back_func_array
call_user_func()的参数不是以引用的方式传递的。// PHP中运行期调用函数,一般是不允许传递引用参数,这在php.ini里是可以设置的:
allow_call_time_pass_reference = Off
但是不推荐使用,因为以后的PHP/Zend是不支持的,如果你把E_NOTICE打开会有下面的说明的:
PHP Warning: Call-time pass-by-reference has been deprecated - argument passed
by value; If you would like to pass it by reference, modify the declaration of
call_user_func(). If you would like to enable call-time pass-by-reference, you
can set allow_call_time_pass_reference to true in your INI file. However, futur
e versions may not support this any longer. in C:\- on line 7
对于问题2的解答,我非常满意。谢谢咯。至于问题1:我的例子是源自于php的帮助文档的。
而问题3,我不懂call_user_func和call_user_func_array有什么区别。因为我自己做过试验。如果将call_user_func的参数用引用的方式传给这个函数的话,产生的效果和call_user_func_array是一样的。我觉得php的官方文档在这里举着两个例子,似乎并不能说明他们的观点。所以很疑惑。还请继续帮忙拉。
function foo() {
static $a;
$a++;
echo "$a\n";
unset($a);
}
foo();
foo();
foo();将输出 1 2 3
请注意,如果“将销毁此变量”成立,则应该输出 1 1 1
写成这样时
function foo() {
static $a;
$a++;
echo "$a,";
unset($a);
echo "$a\n";
}
输出 1, 2, 3,
只能说明 unset($a) 只是删除了 $a 的引用
静态变量是比照全局变量进行处理的