5個php執行個體,細緻說明傳值與傳引用的區別

來源:互聯網
上載者:User

 

【轉自海底蒼鷹tank http://blog.51yip.com/php/878.html】

 

剛學php的時候,那個時候做過很多項目,做東西多,就以為自己php掌握的差不多了,隨著時間的推移,越深入的學習,越覺得自己知道的真的很少,很少。哈哈,會用只是初級階段,要瞭解原理是什麼,這樣才能更好去運用,費話不多說

傳值:是把實參的值賦值給行參 ,那麼對行參的修改,不會影響實參的值

傳引用 :真正的以地址的方式傳遞參數傳遞以後,行參和實參都是同一個對象,只是他們名字不同而已對行參的修改將影響實參的值

說明:

傳值:根copy是一樣的。打個比方,我有一橦房子,我給你建築材料,你建了一個根我的房子一模一樣的房子,你在你的房子做什麼事都不會影響到我,我在我的房子裡做什麼事也不會影響到你,彼此獨立。

傳引用:讓我想起了上大學時學習C語言的指標了,感覺差不多。打個比方,我有一橦房子,我給你一把鑰匙,我們二個都可以進入這個房子,你在房子做什麼都會影響到我。

一,php執行個體

1,傳值 

<?php
$param1=1;               //定義變數1
$param2=2;               //定義變數2
$param2 = $param1;       //變數1賦值給變數2
echo $param2;            //顯示為1

?> 

 2,傳引用

<?php
$param2=1;               //定義變數2
$param1 = &$param2;      //將變數2的引用傳給變數1
echo $param2;            //顯示為1
$param1 = 2;             //把2賦值給變數1
echo $param2;            //顯示為2

?>  

 

3,函數傳值

<?php

//傳值

$param1 = 1;                            //定義變數1

function add($param2)                   //傳參數{

    $param2=3;                          //把3賦值給變數2
}
$param3=add($param1);                   //調用方法add,並將變數1傳給變數2
echo  '<br>$param1=='.$param1.'<br>';   //顯示為$param1==1
echo  '<br>$param2=='.$param2.'<br>';   //顯示為$param2==  因為$param2是局部變數,所以不能影響全域
echo  '<br>$param3=='.$param3.'<br>';   //顯示為$param3==  因為add方法沒有傳回值,所以$param3為空白
?>

 4,函數傳引用

 <?php

//傳值

$param1 = 1;                             //定義變數1

function add(&$param2)                   //傳參數{
    $param2=3;                          //把3賦值給變數2
    return $param2;                   //返回變數2
}
echo  '<br>$param1=='.$param1.'<br>';   //顯示為$param1==1  沒對變數1進行操作
$param3=add($param1);                   //調用方法add,並將變數1的引用傳給變數2
echo  '<br>$param1=='.$param1.'<br>';   //顯示為$param1==3  調用變數過程中,$param2的改變影響變數1,雖然沒有return
echo  '<br>$param2=='.$param2.'<br>';   //顯示為$param2==   因為$param2局部變數,所以不能影響全域
echo  '<br>$param3=='.$param3.'<br>';   //顯示為$param3==   如果把方法裡面的return注釋去掉的話就為$param3==3
?>

 5,函數傳引用2

<?php

//傳引用$param1 = 1;
function &add(&$param2)
{
    $param2 = 2;
    return $param2;
}
$param3=&add($param1);
$param4=add($param1);
echo  '<br>$param3=='.$param3.'<br>';   //顯示為$param3==2
echo  '<br>$param4=='.$param4.'<br>';   //顯示為$param4==2
echo  '<br>$param1=='.$param1.'<br>';   //顯示為$param1==2  調用變數過程中,$param2的改變影響變數1

$param3++;

/*下面顯示為$param1==3,這是因為$param2和$param1引用到同一個地方,
 * 傳回值前面加了地址符號還是一個引用$param3=&add($param1);
 * 這樣$param3,$param2和$param1引用到同一個地方,當$param3++;時,
 * $param1會被改變*/
echo  '<br>$param1=='.$param1.'<br>';  

$param4++;
/* 下面顯示為$param1==3,這裡為什麼是3而不是4呢,這是因為傳回值前面沒有
 * 地址符號,它不是一個引用所以當$param4改變時不會影響$param1*/
echo  '<br>$param1=='.$param1.'<br>';
?>

 二,傳值與傳引用哪個更快

我做了一個測試,測試檔案如是下

1,測試檔案test1--傳引用

<?php

$param = array(1,2,3,4,5,6,7,8,9,10,11,12,1,3,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28);
foreach($param as $k=>&$v){
 $v++;
}
?>

 2,測試檔案test2--傳值

<?php
$param = array(1,2,3,4,5,6,7,8,9,10,11,12,1,3,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28);
foreach($param as $k=>$v){
 $v++;
 $param[$k] = $v;
}
?>

 

 

 

聯繫我們

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