免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2797 | 回复: 9
打印 上一主题 下一主题

关于“引用”的一些秘密 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-10 15:31 |只看该作者 |倒序浏览
看一下下面的代码:

  1. $a = array(1,2,3);
  2. $b = $a;
  3. debug_zval_dump($a);

  4. 输出:
  5. array(3) refcount(3){...}
复制代码
上面的输出很好理解,$b=$a导致refcount+1,$a作为debug_zval_dump的参数再次使refcount+1。
------------------------------------------------------------------------------------------------------------------

修改一下:

  1. $a = array(1,2,3);
  2. $b = $a;
  3. debug_zval_dump(&$a);

  4. 输出:
  5. &array(3) refcount(2){...}
复制代码
看到这里,你可能有点迷糊了,我刚看到输出的时候,也非常的迷惑。这个过程是这样的:
1、$b=$a;
这里没问题,refcount+1

2、debug_zval_dump(&$a);
在这里,php干了一件事,它将$a所对应的内存复制了一份给$b,$a与$b独立了,也就是“Copy on Write”的效果,因此refcount=2
-------------------------------------------------------------------------------------------------------------------

再来:

  1. $a = array(1,2,3);
  2. $b = &$a;
  3. debug_zval_dump(&$a);

  4. 输出:
  5. &array(3) refcount(3){...}
复制代码
在这里,由于$b也是$a的引用,因此在debug_zval_dump(&$a)时没有发生“Copy on Write”。
------------------------------------------------------------------------------------------------------------------

最后一个:

  1. $a = array(1,2,3);
  2. $b = &$a;
  3. debug_zval_dump($a);

  4. 输出:
  5. &array(3) refcount(1){...}
复制代码
这里,在进行debug_zval_dump($a)调用时,直接创建了$a的副本,作为函数的参数。注意与情况1比较。

写php的时候,不正确的使用引用,不仅不能提高效率,反而会起到反效果。

个人的一些见解,欢迎拍砖。
参考:http://www.informit.com/articles/article.aspx?p=516587&seqNum=2

评分

参与人数 1可用积分 +10 信誉积分 +2 收起 理由
bs + 10 + 2 写得不错

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2010-06-11 09:49 |只看该作者
写的好复杂。。一般都不用 &  
写了这些年,都没用过。。。

论坛徽章:
0
3 [报告]
发表于 2010-06-11 10:37 |只看该作者
回复 2# maochanglu

有的东西还是要深入了解一下还是很好好处的

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
4 [报告]
发表于 2010-06-12 08:47 |只看该作者
有道理啊 如果说不知道当你在无意中用到了  就不知道是什么原因了 但是如果知道了  那就好办多了

论坛徽章:
0
5 [报告]
发表于 2010-06-15 21:58 |只看该作者
学习了,谢谢分享

论坛徽章:
52
码神
日期:2017-03-28 10:27:10综合交流区版块每日发帖之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-09-28 06:20:00综合交流区版块每日发帖之星
日期:2015-09-22 06:20:00每日论坛发贴之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-08 06:20:00综合交流区版块每日发帖之星
日期:2015-09-05 06:20:00综合交流区版块每日发帖之星
日期:2015-09-04 06:20:002015亚冠之德黑兰石油
日期:2015-09-01 10:41:53每日论坛发贴之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-10-12 06:20:00
6 [报告]
发表于 2010-06-16 22:24 |只看该作者
真不错,谢谢分享。

论坛徽章:
0
7 [报告]
发表于 2010-06-22 11:53 |只看该作者
好文章啊。
变量在赋值的时候,都是指向同一片内存,ref+1
如果引用赋值,则ref不变。
在调用函数的时候,只要有引用存在,php在内部就会进行内存的智能分离,这就是2跟4的区别!

论坛徽章:
0
8 [报告]
发表于 2010-06-22 13:21 |只看该作者
我是菜鸟看不懂。。。
同2楼一样,真么用过&
水平有限吧,还没涉及到这些知识。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
9 [报告]
发表于 2010-06-24 14:31 |只看该作者
真不错,谢谢分享。

论坛徽章:
0
10 [报告]
发表于 2010-06-25 14:50 |只看该作者
不错,谢谢分享了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP