给大家一个关于PHP有趣的小问题
时间:2011-09-09
来源:互联网
$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),猜想它又是一个什么结果,然后再运行,看与你猜想的结果对不对,
当然欢迎你说出你的运行结果以及为什么,我会在最后也说一下具体的原因.就当大家讨论一个小问题,这也是我工作当中遇到的一个小问题,以前没有具体的关心过.
作者: quzhongxiong 发布时间: 2011-09-09
这没什么惊呀的,PHP变量在内部是以引用计数来标识的,而且为了提高效率,变量在赋值操作时,只是把新变量直接指向源变量的值,然后增加源变量的引用计数,只有当新变量有写入操作时才开始复制一份新的值。
而unset在内部是先减少引用计数,当引用计数为0时才真正释放变量。
就是因为这样,你的代码中$test2只是赋值没有做任何的操作,所以与$test共享一份内存,所以unset无法释放变量。
这些东西你可以去看PHP的源代码,看看就明白了。
作者: zhouzhipen 发布时间: 2011-09-09
作者: UltraWind 发布时间: 2011-09-09
你是想说unset($test2->findkey);这行代码没有起作用吗?
这没什么惊呀的,PHP变量在内部是以引用计数来标识的,而且为了提高效率,变量在赋值操作时,只是把新变量直接指向源变量的值,然后增加源变量的引用计数,只有当新变量有写入操作时才开始复制一份新的值。
而unset在内部是先减少引用计数,当引用计数为0时才真正释放变量。
就是因为这样,你的代码中$test2只是赋值没有……
这位兄弟,看来你可能是没有运行我的代码,你说的我自然还算是清楚,你这里还有一个小问题可能没有讲到,只是讲到了变量间的赋值,这个问题是什么,我先不说,后面应该有大牛来讲的,呵,静待,
PS:我这个纯粹是发起一个小的讨论
作者: quzhongxiong 发布时间: 2011-09-09
你想表达什么呢
呵呵,如果你运行我说的不同情况的代码,自然就应该清楚我说的是什么了.
作者: quzhongxiong 发布时间: 2011-09-09
PHP code
$test2 = $test; //共享一个zval,is_ref=1,refcount=2 unset($test2->findkey);//改变zval的值 //unset($test2);//$test2断开zval,is_ref=0,refcount=1,但$test仍然指向着那个zval
有点像老板邀请你技术入股,开发某个产品,你的技术可以改变这个产品的形态,但是你离职了,产品还是老板的。
作者: foolbirdflyfirst 发布时间: 2011-09-09
呵呵,不错。对象传递是引用传递,那两个unset虽同名但是有不同的意味
PHP code
$test2 = $test; //共享一个zval,is_ref=1,refcount=2
unset($test2->findkey);//改变zval的值
//unset($test2);//$test2断开zval,is_ref=0,refcount=1,但$test仍然指向着那个zval
……
哈哈,对头,确实是这样的,这个要用PHP的技术语来解释的话,就是两个关键点,一个是对象间的复制,还有一个PHP的GC机制,基本上可以概况这个问题产生的不同意思了.
作者: quzhongxiong 发布时间: 2011-09-09
只进行这个操作之后,test对象应该有4个值,而不是2个。unset($test2->findkey);这个操作为什么会把$test-findkey也给unset了呢?
作者: wswssx 发布时间: 2011-09-09
作者: moocky 发布时间: 2011-09-09
基础没打扎实,不清楚为什么操作test2,test也会变化。我的想法unset($test2->findkey);
只进行这个操作之后,test对象应该有4个值,而不是2个。unset($test2->findkey);这个操作为什么会把$test-findkey也给unset了呢?
哈,看来这位兄弟是运行过了,其实这个是牵涉到了PHP的一个知识点,就是我上面提到的对象间的复制,你可以去找一下相关的资料,知道了这个,再可以查找一下关于PHP的垃圾回收机制,你就应该很清楚了
作者: quzhongxiong 发布时间: 2011-09-09
是在没发现有什么特别的地方,楼猪想说什么?
呵,我不知道这位兄弟是已经彻底明白了这个问题,觉得这几条语句的返回结果都很符合我们的逻辑,还是因为没注意到销毁不同变量的运行结果
作者: quzhongxiong 发布时间: 2011-09-09
作者: moocky 发布时间: 2011-09-09
作者: luck_mimi 发布时间: 2011-09-09
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28