$test->findkey[]    = 'test1 =?';
$test->findval[]    = 2;
$test->findkey[]    = 'test2 =?';
$test->findval[]    = 3;
$test2  = $test;
unset($test2->findkey);
//unset($test2);
print_R($test);
print_R('<br />');exit;
大家先猜想一下它的运行结果,然后再试运行一下看这个结果与你想像中的对不对然后大家再把销毁变量那改成这样unset($test2),猜想它又是一个什么结果,然后再运行,看与你猜想的结果对不对,当然欢迎你说出你的运行结果以及为什么,我会在最后也说一下具体的原因.就当大家讨论一个小问题,这也是我工作当中遇到的一个小问题,以前没有具体的关心过.

解决方案 »

  1.   

    你是想说unset($test2->findkey);这行代码没有起作用吗?
    这没什么惊呀的,PHP变量在内部是以引用计数来标识的,而且为了提高效率,变量在赋值操作时,只是把新变量直接指向源变量的值,然后增加源变量的引用计数,只有当新变量有写入操作时才开始复制一份新的值。
    而unset在内部是先减少引用计数,当引用计数为0时才真正释放变量。
    就是因为这样,你的代码中$test2只是赋值没有做任何的操作,所以与$test共享一份内存,所以unset无法释放变量。这些东西你可以去看PHP的源代码,看看就明白了。
      

  2.   

    呵呵,不错。对象传递是引用传递,那两个unset虽同名但是有不同的意味
    $test2  = $test; //共享一个zval,is_ref=1,refcount=2
    unset($test2->findkey);//改变zval的值
    //unset($test2);//$test2断开zval,is_ref=0,refcount=1,但$test仍然指向着那个zval有点像老板邀请你技术入股,开发某个产品,你的技术可以改变这个产品的形态,但是你离职了,产品还是老板的。
      

  3.   


    哈哈,对头,确实是这样的,这个要用PHP的技术语来解释的话,就是两个关键点,一个是对象间的复制,还有一个PHP的GC机制,基本上可以概况这个问题产生的不同意思了.
      

  4.   

    基础没打扎实,不清楚为什么操作test2,test也会变化。我的想法unset($test2->findkey);
    只进行这个操作之后,test对象应该有4个值,而不是2个。unset($test2->findkey);这个操作为什么会把$test-findkey也给unset了呢?
      

  5.   


    哈,看来这位兄弟是运行过了,其实这个是牵涉到了PHP的一个知识点,就是我上面提到的对象间的复制,你可以去找一下相关的资料,知道了这个,再可以查找一下关于PHP的垃圾回收机制,你就应该很清楚了
      

  6.   

    注意看手册,这个问题就不会有疑问,你在php4和php5的运行结果可能会不同,PHP5中已经有明确的说明,对象的传递方式!
      

  7.   

    php很多时候大家不注重如何传递,所以出现疑惑。