動態網頁PHP中引用&的使用注意事項

來源:互聯網
上載者:User

之前一個朋友的文章提到過這方面的疑問,這裡簡單整理一下,希望能讓更多新學php的朋友得到協助。

php的引用(就是在變數或者函數、對象等前面加上&符號)是個進階話題,新手多注意,正確的理解php的引用很重要,對效能有較大影響,而且理解錯誤可能導致程式錯誤!

很多人誤解php中的引用跟C當中的指標一樣,事實上並非如此,而且很大差別。C語言中的指標除了在數組傳遞過程中不用顯式申明外,其他都需要使用*進行定義,而php中對於地址的指向(類似指標)功能不是由使用者自己來實現的,是由Zend核心實現的,php中引用採用的是“寫時拷貝”的原理,就是除非發生寫操作,指向同一個地址的變數或者對象是不會被拷貝的,比如下面的代碼:

$a = array('a','c'...'n');
$b = $a;

如果程式僅執行到這裡,$b和$b是相同的,但是並沒有像C那樣,$a和$b佔用不同的記憶體空間,而是指向了同一塊記憶體,這就是php和c的差別,並不需要寫成$b=&$a才表示$b指向$a的記憶體,zend就已經幫你實現了引用,並且zend會非常智能的幫你去判斷什麼時候該這樣處理,什麼時候不該這樣處理。

如果在後面繼續寫如下代碼,增加一個函數,通過引用的方式傳遞參數,並列印輸出數組大小。

    function printArray(&$arr) //引用傳遞
    {
        print(count($arr));
    }
     printArray($a);

上面的代碼中,我們通過引用把$a數組傳入printArray()函數,zend引擎會認為printArray()可能會導致對$a的改變,此時就會自動為$b生產一個$a的資料拷貝,重新申請一塊記憶體進行儲存。這就是前面提到的“寫時拷貝”概念。

如果我們把上面的代碼改成下面這樣:

    function printArray($arr)  //值傳遞
    {
        print(count($arr));
    }
     printArray($a);

上面的代碼直接傳遞$a值到printArray()中,此時並不存在引用傳遞,所以沒有出現寫時拷貝。

大家可以測試一下上面兩行代碼的執行效率,比如外面加入一個迴圈1000次,看看啟動並執行耗時,結果會讓你知道不正確使用引用會導致效能下降30%以上。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.