- 论坛徽章:
- 0
|
看一下下面的代码:
- $a = array(1,2,3);
- $b = $a;
- debug_zval_dump($a);
- 输出:
- array(3) refcount(3){...}
复制代码 上面的输出很好理解,$b=$a导致refcount+1,$a作为debug_zval_dump的参数再次使refcount+1。
------------------------------------------------------------------------------------------------------------------
修改一下:
- $a = array(1,2,3);
- $b = $a;
- debug_zval_dump(&$a);
- 输出:
- &array(3) refcount(2){...}
复制代码 看到这里,你可能有点迷糊了,我刚看到输出的时候,也非常的迷惑。这个过程是这样的:
1、$b=$a;
这里没问题,refcount+1
2、debug_zval_dump(&$a);
在这里,php干了一件事,它将$a所对应的内存复制了一份给$b,$a与$b独立了,也就是“Copy on Write”的效果,因此refcount=2
-------------------------------------------------------------------------------------------------------------------
再来:
- $a = array(1,2,3);
- $b = &$a;
- debug_zval_dump(&$a);
- 输出:
- &array(3) refcount(3){...}
复制代码 在这里,由于$b也是$a的引用,因此在debug_zval_dump(&$a)时没有发生“Copy on Write”。
------------------------------------------------------------------------------------------------------------------
最后一个:
- $a = array(1,2,3);
- $b = &$a;
- debug_zval_dump($a);
- 输出:
- &array(3) refcount(1){...}
复制代码 这里,在进行debug_zval_dump($a)调用时,直接创建了$a的副本,作为函数的参数。注意与情况1比较。
写php的时候,不正确的使用引用,不仅不能提高效率,反而会起到反效果。
个人的一些见解,欢迎拍砖。
参考:http://www.informit.com/articles/article.aspx?p=516587&seqNum=2 |
评分
-
查看全部评分
|