国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

動態(tài)網(wǎng)頁PHP中引用&的使用注意事項

2024-05-04 23:03:27
字體:
供稿:網(wǎng)友

之前一個朋友的帖子提到過這方面的疑問,這里簡單整理一下,希望能讓更多新學(xué)php的朋友得到幫助。

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

很多人誤解php中的引用跟c當中的指針一樣,事實上并非如此,而且很大差別。c語言中的指針除了在數(shù)組傳遞過程中不用顯式申明外,其他都需要使用*進行定義,而php中對于地址的指向(類似指針)功能不是由用戶自己來實現(xiàn)的,是由zend核心實現(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)幫你實現(xiàn)了引用,并且zend會非常智能的幫你去判斷什么時候該這樣處理,什么時候不該這樣處理。

如果在后面繼續(xù)寫如下代碼,增加一個函數(shù),通過引用的方式傳遞參數(shù),并打印輸出數(shù)組大小。

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

上面的代碼中,我們通過引用把$a數(shù)組傳入printarray()函數(shù),zend引擎會認為printarray()可能會導(dǎo)致對$a的改變,此時就會自動為$b生產(chǎn)一個$a的數(shù)據(jù)拷貝,重新申請一塊內(nèi)存進行存儲。這就是前面提到的“寫時拷貝”概念。

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

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

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

大家可以測試一下上面兩行代碼的執(zhí)行效率,比如外面加入一個循環(huán)1000次,看看運行的耗時,結(jié)果會讓你知道不正確使用引用會導(dǎo)致性能下降30%以上。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉溪市| 葵青区| 法库县| 西乡县| 时尚| 金门县| 柘荣县| 彭山县| 太康县| 三都| 阜南县| 石台县| 泰宁县| 丹江口市| 南宁市| 禹州市| 内乡县| 马山县| 板桥市| 绵阳市| 筠连县| 广丰县| 高阳县| 历史| 阳谷县| 罗甸县| 响水县| 军事| 丽江市| 高安市| 城固县| 望谟县| 玉溪市| 鲁甸县| 奉节县| 衡阳县| 北碚区| 简阳市| 冕宁县| 南涧| 阿勒泰市|