您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

从PHP的引用BUG谈开去

2025/10/24 14:50:35发布10次查看
大蛇写这篇文章是因为tipi上关于php写时复制(copy-on-write)问题被同事发到群里,引起了我的兴趣。下面就把这个问题说出来,大家想想为什么: ?php$foo['love']= 1;$bar= $tipi= $foo;$tipi['love']= '2';echo $foo['love']; // 输出 2 相信很多人会认为这
大蛇写这篇文章是因为tipi上关于php写时复制(copy-on-write)问题被同事发到群里,引起了我的兴趣。下面就把这个问题说出来,大家想想为什么:
love: refcount=1; isref=0;$bar = &$foo['love'];// $bar: refcount=2; isref=1;// $foo->love: refcount=2; isref=1;// $foo: refcount=1; isref=0;$tipi = $foo;// $foo: refcount=2; isref=0;// $foo->love: refcount=2; isref=1;// $tipi: refcount=2; isref=0;// $tipi->love: refcount=2; isref=1;// 注意,这一步复合类型(array)$foo的refcount自增到2,而$foo['love']还是数组的hashtable指向的另一块内存地址,它并不会被复制$tipi['love'] = '2';// 这里的$tipi['love']是一个引用,如同$foo['love']一样echo $foo['love']; // 所以当$tipi['love']改变以后,这里自然会输出 2
理解了吗?
相信你看完这个分析后也会认为这个是php的特色,我也是这么想的。知道真相后似乎要推翻之前的结论——这是个bug。但是仔细想想,这种坑实际上是不应该出现的,所以我还是坚持最开始的想法——这就是个bug!当然,见仁见智。
引用不要滥用,因为php本身已经对变量做了很好的优化。但是有些时候还是该用,比如你实际上想传址而不是传值。
另外,大蛇要提醒一句,在5.4.0中,动态引用已经被取消了,例如:
function myfunc($var){ $var = 1;}myfunc(& $foo)
这里这种写法是会导致错误出现的,正确的用法应该是:
function myfunc(& $var){ $var = 1;}myfunc($foo)
好吧,到这里,就到这里,再见吧! 原文地址:从php的引用bug谈开去, 感谢原作者分享。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product