PHP引用&符號的注意問題有哪些,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了原陽免費(fèi)建站歡迎大家使用!
PHP引用&符號是一個比較難掌握的知識點(diǎn)。新手們在實(shí)際編寫代碼時一定要多注意這一點(diǎn),因?yàn)槿绻銓HP引用&符號的使用理解錯誤,將會導(dǎo)致你所編寫的整個代碼出現(xiàn)錯誤。
很多人誤解php中的引用跟C當(dāng)中的指針一樣,事實(shí)上并非如此,而且很大差別。C語言中的指針除了在數(shù)組傳遞過程中不用顯式申明外,其他都需要使用*進(jìn)行定義,而php中對于地址的指向(類似指針)功能不是由用戶自己來實(shí)現(xiàn)的,是由Zend核心實(shí)現(xiàn)的,PHP引用&符號采用的是“寫時拷貝”的原理,就是除非發(fā)生寫操作,指向同一個地址的變量或者對象是不會被拷貝的,比如下面的代碼:
$a = array('a','c'...'n'); $b = $a;
如果程序僅執(zhí)行到這里,$b和$b是相同的,但是并沒有像C那樣,$a和$b占用不同的內(nèi)存空間,而是指向了同一塊內(nèi)存,這就是php和c的差別,并不需要寫成$b=&$a才表示$b指向$a的內(nèi)存,zend就已經(jīng)幫你實(shí)現(xiàn)了引用,并且zend會非常智能的幫你去判斷什么時候該這樣處理,什么時候不該這樣處理。
如果在后面繼續(xù)寫如下代碼,增加一個函數(shù),通過PHP引用&符號的方式傳遞參數(shù),并打印輸出數(shù)組大小。
function printArray(&$arr) //引用傳遞 { print(count($arr)); } printArray($a);
上面的代碼中,我們通過PHP引用&符號把$a數(shù)組傳入printArray()函數(shù),zend引擎會認(rèn)為printArray()可能會導(dǎo)致對$a的改變,此時就會自動為$b生產(chǎn)一個$a的數(shù)據(jù)拷貝,重新申請一塊內(nèi)存進(jìn)行存儲。這就是前面提到的“寫時拷貝”概念。
如果我們把上面的代碼改成下面這樣:
function printArray($arr) //值傳遞 { print(count($arr)); } printArray($a);
上面的代碼直接傳遞$a值到printArray()中,此時并不存在引用傳遞,所以沒有出現(xiàn)寫時拷貝。
大家可以測試一下上面兩行代碼的執(zhí)行效率,比如外面加入一個循環(huán)1000次,看看運(yùn)行的耗時,結(jié)果會讓你知道不正確使用PHP引用&符號會導(dǎo)致性能下降30%以上。
看完上述內(nèi)容,你們掌握PHP引用&符號的注意問題有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!