通過xdebug來分析PHP引用
一直沒搞懂php的引用,今天面試的時候又碰到了,藉助xdebug貌似理解了一點,記錄一下。
?
code1:
?
$a = "xiaoshenge";$b = &$a;unset($b);echo "b=$b";echo "a=$a";
結果:b=a=xiaoshenge
?
code2:
$a = "xiaoshenge";$b = &$a;unset($a);echo "b=$b";echo "a=$a";
結果:b=xiaoshengea=??
?
猜測:
?
面試的時候是code1,由於沒搞懂PHP的引用當時就猜測的寫了b=a=,其實這與我把引用跟c裡面的指標搞混了有關。回來之後,調試了一下code2,然後徹底迷惑了,於是求救與PHP文檔。
?
PHP文檔中對於引用的介紹:
?
?
引用是什麼:在 PHP 中引用意味著用不同的名字訪問同一個變數內容。這並不像 C 的指標,替代的是,引用是符號表別名。注意在 PHP 中,變數名和變數內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 Unix 的檔案名稱和檔案本身——變數名是目錄條目,而變數內容則是檔案本身。引用可以被看作是 Unix 檔案系統中的 hardlink。
?
取值 (Dereference):當 unset 一個引用,只是斷開了變數名和變數內容之間的綁定。這並不意味著變數內容被銷毀了。例如:
?
?不會 unset?$b,只是?$a。再拿這個和 Unix 的?unlink?調用來類比一下可能有助於理解。
?
推斷:
?
文檔裡面有介紹”引用可以被當作是unix檔案系統中的hardlink“,參考http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=150986?中的介紹:
硬串連是給檔案一個副本,同時建立兩者之間的串連關係。修改其中一個,與其串連的檔案同時被修改。如果刪除其中[color=red]任意一個[/color]其餘的檔案將不受影響。?
軟串連也叫符號串連,他只是對源檔案在新的位置建立一個“快捷(借用一下wondows常用詞)”,所以,當源檔案刪除時,符號串連的檔案將成為無源之水->僅僅剩下個檔案名稱了,當然刪除這個串連,也不會影響到源檔案,但對串連檔案的使用、引用都是直接調用源檔案的。?
?
通過xdebug來看zval容器中的變化:
?
code1:
?
$a = "xiaoshenge";$b = &$a;xdebug_debug_zval( 'a' );xdebug_debug_zval( 'b' );unset($b);xdebug_debug_zval( 'a' );xdebug_debug_zval( 'b' );
結果:
?
a:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
b:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
a:
(refcount=1, is_ref=0),string 'xiaoshenge' (length=10)
?
code2:
?
$a = "xiaoshenge";$b = &$a;xdebug_debug_zval( 'a' );xdebug_debug_zval( 'b' );unset($a);xdebug_debug_zval( 'a' );xdebug_debug_zval( 'b' );
?結果:
a:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
b:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
b:
(refcount=1, is_ref=0),string 'xiaoshenge' (length=10)
?
?
結合unix的永久連結來看(應該如下):
unset($a),只是銷毀了a-x部分所以$b還在。
?
$b=&$b,不是指標那樣,$b指向$a,(指標,貌似我的C都還給書了,要補習了)
?
面試感受:不能人云亦云,要自己動手,自己思考。PHP手冊不能輕視,這個問題文檔裡面有。