探討PHP引用&符號的一些注意問題
PHP引用&符號是一個比較難掌握的知識點。新手們在實際編寫代碼時一定要多注意這一點,因為如果你對PHP引用&符號的使用理解錯誤,將會導致你所編寫的整個代碼出現錯誤。
如何運用PHP關聯陣列查詢結果
PHP常見錯誤的具體糾正方法
PHP函數header()查詢單組件的具體方法解..
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會非常智能的幫你去判斷什麼時候該這樣處理,什麼時候不該這樣處理。
如果在後面繼續寫如下代碼,增加一個函數,通過PHP引用&符號的方式傳遞參數,並列印輸出數組大小。
function printArray(&$arr) //引用傳遞 { print(count($arr)); } printArray($a); 上面的代碼中,我們通過PHP引用&符號把$a數組傳入printArray()函數,zend引擎會認為printArray()可能會導致對$a的改變,此時就會
自動為$b生產一個$a的資料拷貝,重新申請一塊記憶體進行儲存。這就是前面提到的“寫時拷貝”概念。
如果我們把上面的代碼改成下面這樣:
function printArray($arr) //值傳遞 { print(count($arr)); } printArray($a);
上面的代碼直接傳遞$a值到printArray()中,此時並不存在引用傳遞,所以沒有出現寫時拷貝。
大家可以測試一下上面兩行代碼的執行效率,比如外面加入一個迴圈1000次,看看啟動並執行耗時,結果會讓你知道不正確使用PHP引用&符號會導致效能下降30%以上。