免费注册 查看新帖 |

Chinaunix

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

通过xdebug来分析PHP引用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 23:52 |只看该作者 |倒序浏览

通过xdebug来分析PHP引用










一直没搞懂php的引用,今天面试的时候又碰到了,借助xdebug貌似理解了一点,记录一下。



code1:





Php代码
  1. 1.$a = "xiaoshenge";  
  2. 2.$b = &$a;  
  3. 3.unset($b);  
  4. 4.echo "b=$b";  
  5. 5.echo "a=$a";  
复制代码
结果:b=a=xiaoshenge



code2:



Php代码
  1. 1.$a = "xiaoshenge";  
  2. 2.$b = &$a;  
  3. 3.unset($a);  
  4. 4.echo "b=$b";  
  5. 5.echo "a=$a";  
复制代码
结果:b=xiaoshengea=  



猜测:



面试的时候是code1,由于没搞懂PHP的引用当时就猜测的写了b=a=,其实这与我把引用跟c里面的指针搞混了有关。回来之后,调试了一下code2,然后彻底迷惑了,于是求救与PHP文档。



PHP文档中对于引用的介绍:





引用是什么:在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。



取消引用:当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:





Php代码
  1. 1.<?php  
  2. 2.$a = 1;  
  3. 3.$b =& $a;  
  4. 4.unset($a);  
  5. 5.?>  
复制代码
不会 unset $b,只是 $a。再拿这个和 Unix 的 unlink 调用来类比一下可能有助于理解。



推断:



文档里面有介绍”引用可以被当作是unix文件系统中的hardlink“,参考 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=150986 中的介绍:

硬连接是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。

软连接也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。



通过xdebug来看zval容器中的变化:



code1:





Php代码
  1. 1.$a = "xiaoshenge";  
  2. 2.$b = &$a;  
  3. 3.xdebug_debug_zval( 'a' );  
  4. 4.xdebug_debug_zval( 'b' );  
  5. 5.  
  6. 6.unset($b);  
  7. 7.xdebug_debug_zval( 'a' );  
  8. 8.xdebug_debug_zval( 'b' );  
复制代码
结果:

  1. a:
  2. (refcount=2, is_ref=1),string 'xiaoshenge' (length=10)

  3. b:
  4. (refcount=2, is_ref=1),string 'xiaoshenge' (length=10)

  5. a:
  6. (refcount=1, is_ref=0),string 'xiaoshenge' (length=10)
复制代码
code2:





Php代码
  1. 1.$a = "xiaoshenge";  
  2. 2.$b = &$a;  
  3. 3.xdebug_debug_zval( 'a' );  
  4. 4.xdebug_debug_zval( 'b' );  
  5. 5.  
  6. 6.unset($a);  
  7. 7.xdebug_debug_zval( 'a' );  
  8. 8.xdebug_debug_zval( 'b' );  
复制代码
结果:
  1. a:
  2. (refcount=2, is_ref=1),string 'xiaoshenge' (length=10)

  3. b:
  4. (refcount=2, is_ref=1),string 'xiaoshenge' (length=10)

  5. b:
  6. (refcount=1, is_ref=0),string 'xiaoshenge' (length=10)
复制代码
结合unix的硬链接来看(应该如下):




unset($a),只是销毁了a-x部分所以$b还在。



$b=&$b,不是指针那样,$b指向$a,(指针,貌似我的C都还给书了,要补习了)



面试感受:不能人云亦云,要自己动手,自己思考。PHP手册不能轻视,这个问题文档里面有。

论坛徽章:
0
2 [报告]
发表于 2011-12-21 21:43 |只看该作者
学习鸟 谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP