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

解决方案 »

  1.   

    对不起,刚才拷错了
    foo();// 第一次调用unset之前$a = 1, unset之后$a = 1
    foo();// 第二次调用unset之前$a++ = 1 ++ = 2, unset之后$a = 1
    foo();// 第三次调用unset之前$a++ = 2 ++ = 3, unset之后$a = 1
      

  2.   

    2>在 Zend 引擎 1 代,它驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的: 
    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
      

  3.   

    多谢楼上的回答。
    对于问题2的解答,我非常满意。谢谢咯。至于问题1:我的例子是源自于php的帮助文档的。
    而问题3,我不懂call_user_func和call_user_func_array有什么区别。因为我自己做过试验。如果将call_user_func的参数用引用的方式传给这个函数的话,产生的效果和call_user_func_array是一样的。我觉得php的官方文档在这里举着两个例子,似乎并不能说明他们的观点。所以很疑惑。还请继续帮忙拉。
      

  4.   

    对于1,手册中的描述与实际结果是矛盾的。至少中文手册是这样的,不知道英文原文是怎样的,不过我不懂英文。如果在函数中 unset() 一个静态变量,则 unset() 将销毁此变量及其所有的引用。
    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 的引用
    静态变量是比照全局变量进行处理的
      

  5.   

    楼上,i agree。静态变量是存放在静态存储区的,应该不是"销毁"得了的.多谢你的回答!现在还有问题3:似乎也没有问的必要了。手册里面错的地方还不少……