给大家一个关于PHP有趣的小问题

quzhongxiong 2011-09-09 03:14:56

$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),猜想它又是一个什么结果,然后再运行,看与你猜想的结果对不对,

当然欢迎你说出你的运行结果以及为什么,我会在最后也说一下具体的原因.就当大家讨论一个小问题,这也是我工作当中遇到的一个小问题,以前没有具体的关心过.
...全文
164 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luck_mimi 2011-09-09
  • 打赏
  • 举报
回复
php很多时候大家不注重如何传递,所以出现疑惑。
木目子 2011-09-09
  • 打赏
  • 举报
回复
注意看手册,这个问题就不会有疑问,你在php4和php5的运行结果可能会不同,PHP5中已经有明确的说明,对象的传递方式!
quzhongxiong 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 moocky 的回复:]

是在没发现有什么特别的地方,楼猪想说什么?
[/Quote]

呵,我不知道这位兄弟是已经彻底明白了这个问题,觉得这几条语句的返回结果都很符合我们的逻辑,还是因为没注意到销毁不同变量的运行结果

quzhongxiong 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wswssx 的回复:]

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

哈,看来这位兄弟是运行过了,其实这个是牵涉到了PHP的一个知识点,就是我上面提到的对象间的复制,你可以去找一下相关的资料,知道了这个,再可以查找一下关于PHP的垃圾回收机制,你就应该很清楚了
木目子 2011-09-09
  • 打赏
  • 举报
回复
是在没发现有什么特别的地方,楼猪想说什么?
wswssx 2011-09-09
  • 打赏
  • 举报
回复
基础没打扎实,不清楚为什么操作test2,test也会变化。我的想法unset($test2->findkey);
只进行这个操作之后,test对象应该有4个值,而不是2个。unset($test2->findkey);这个操作为什么会把$test-findkey也给unset了呢?
quzhongxiong 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 foolbirdflyfirst 的回复:]

呵呵,不错。对象传递是引用传递,那两个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

……
[/Quote]

哈哈,对头,确实是这样的,这个要用PHP的技术语来解释的话,就是两个关键点,一个是对象间的复制,还有一个PHP的GC机制,基本上可以概况这个问题产生的不同意思了.
foolbirdflyfirst 2011-09-09
  • 打赏
  • 举报
回复
呵呵,不错。对象传递是引用传递,那两个unset虽同名但是有不同的意味
$test2  = $test; //共享一个zval,is_ref=1,refcount=2
unset($test2->findkey);//改变zval的值
//unset($test2);//$test2断开zval,is_ref=0,refcount=1,但$test仍然指向着那个zval


有点像老板邀请你技术入股,开发某个产品,你的技术可以改变这个产品的形态,但是你离职了,产品还是老板的。
quzhongxiong 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ultrawind 的回复:]

你想表达什么呢
[/Quote]

呵呵,如果你运行我说的不同情况的代码,自然就应该清楚我说的是什么了.
quzhongxiong 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouzhipen 的回复:]

你是想说unset($test2->findkey);这行代码没有起作用吗?
这没什么惊呀的,PHP变量在内部是以引用计数来标识的,而且为了提高效率,变量在赋值操作时,只是把新变量直接指向源变量的值,然后增加源变量的引用计数,只有当新变量有写入操作时才开始复制一份新的值。
而unset在内部是先减少引用计数,当引用计数为0时才真正释放变量。
就是因为这样,你的代码中$test2只是赋值没有……
[/Quote]

这位兄弟,看来你可能是没有运行我的代码,你说的我自然还算是清楚,你这里还有一个小问题可能没有讲到,只是讲到了变量间的赋值,这个问题是什么,我先不说,后面应该有大牛来讲的,呵,静待,

PS:我这个纯粹是发起一个小的讨论
UltraWind 2011-09-09
  • 打赏
  • 举报
回复
你想表达什么呢
zhouzhipen 2011-09-09
  • 打赏
  • 举报
回复
你是想说unset($test2->findkey);这行代码没有起作用吗?
这没什么惊呀的,PHP变量在内部是以引用计数来标识的,而且为了提高效率,变量在赋值操作时,只是把新变量直接指向源变量的值,然后增加源变量的引用计数,只有当新变量有写入操作时才开始复制一份新的值。
而unset在内部是先减少引用计数,当引用计数为0时才真正释放变量。
就是因为这样,你的代码中$test2只是赋值没有做任何的操作,所以与$test共享一份内存,所以unset无法释放变量。

这些东西你可以去看PHP的源代码,看看就明白了。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧