- 論壇徽章:
- 0
|
看一下下面的代碼:
- $a = array(1,2,3);
- $b = $a;
- debug_zval_dump($a);
- 輸出:
- array(3) refcount(3){...}
復(fù)制代碼 上面的輸出很好理解,$b=$a導(dǎo)致refcount+1,$a作為debug_zval_dump的參數(shù)再次使refcount+1。
------------------------------------------------------------------------------------------------------------------
修改一下:
- $a = array(1,2,3);
- $b = $a;
- debug_zval_dump(&$a);
- 輸出:
- &array(3) refcount(2){...}
復(fù)制代碼 看到這里,你可能有點(diǎn)迷糊了,我剛看到輸出的時候,也非常的迷惑。這個過程是這樣的:
1、$b=$a;
這里沒問題,refcount+1
2、debug_zval_dump(&$a);
在這里,php干了一件事,它將$a所對應(yīng)的內(nèi)存復(fù)制了一份給$b,$a與$b獨(dú)立了,也就是“Copy on Write”的效果,因此refcount=2
-------------------------------------------------------------------------------------------------------------------
再來:
- $a = array(1,2,3);
- $b = &$a;
- debug_zval_dump(&$a);
- 輸出:
- &array(3) refcount(3){...}
復(fù)制代碼 在這里,由于$b也是$a的引用,因此在debug_zval_dump(&$a)時沒有發(fā)生“Copy on Write”。
------------------------------------------------------------------------------------------------------------------
最后一個:
- $a = array(1,2,3);
- $b = &$a;
- debug_zval_dump($a);
- 輸出:
- &array(3) refcount(1){...}
復(fù)制代碼 這里,在進(jìn)行debug_zval_dump($a)調(diào)用時,直接創(chuàng)建了$a的副本,作為函數(shù)的參數(shù)。注意與情況1比較。
寫php的時候,不正確的使用引用,不僅不能提高效率,反而會起到反效果。
個人的一些見解,歡迎拍磚。
參考:http://www.informit.com/articles/article.aspx?p=516587&seqNum=2 |
評分
-
查看全部評分
|