經過xdebug來分析PHP引用

來源:互聯網
上載者:User
通過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手冊不能輕視,這個問題文檔裡面有。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.