通過5個php執行個體細緻說明傳值與傳引用的區別_PHP
來源:互聯網
上載者:User
關鍵字
傳值
傳引用
哈哈,會用只是初級階段,要瞭解原理是什麼,這樣才能更好去運用,費話不多說
傳值:是把實參的值賦值給行參 ,那麼對行參的修改,不會影響實參的值
傳引用 :真正的以地址的方式傳遞參數傳遞以後,行參和實參都是同一個對象,只是他們名字不同而已對行參的修改將影響實參的值
說明:
傳值:根copy是一樣的。打個比方,我有一橦房子,我給你建築材料,你建了一個根我的房子一模一樣的房子,你在你的房子做什麼事都不會影響到我,我在我的房子裡做什麼事也不會影響到你,彼此獨立。
傳引用:讓我想起了上大學時學習C語言的指標了,感覺差不多。打個比方,我有一橦房子,我給你一把鑰匙,我們二個都可以進入這個房子,你在房子做什麼都會影響到我。
一,php執行個體
1,傳值
複製代碼 代碼如下:
$param1=1; //定義變數1
$param2=2; //定義變數2
$param2 = $param1; //變數1賦值給變數2
echo $param2; //顯示為1
?>
2,傳引用
複製代碼 代碼如下:
$param2=1; //定義變數2
$param1 = &$param2; //將變數2的引用傳給變數1
echo $param2; //顯示為1
$param1 = 2; //把2賦值給變數1
echo $param2; //顯示為2
?>
3,函數傳值
複製代碼 代碼如下:
//傳值
$param1 = 1; //定義變數1
function add($param2) //傳參數
{
$param2=3; //把3賦值給變數2
}
$param3=add($param1); //調用方法add,並將變數1傳給變數2
echo '
$param1=='.$param1.'
'; //顯示為$param1==1
echo '
$param2=='.$param2.'
'; //顯示為$param2== 因為$param2是局部變數,所以不能影響全域
echo '
$param3=='.$param3.'
'; //顯示為$param3== 因為add方法沒有傳回值,所以$param3為空白
?>
4,函數傳引用
複製代碼 代碼如下:
//傳值
$param1 = 1; //定義變數1
function add(&$param2) //傳參數
{
$param2=3; //把3賦值給變數2
// return $param2; //返回變數2
}
echo '
$param1=='.$param1.'
'; //顯示為$param1==1 沒對變數1進行操作
$param3=add($param1); //調用方法add,並將變數1的引用傳給變數2
echo '
$param1=='.$param1.'
'; //顯示為$param1==3 調用變數過程中,$param2的改變影響變數1,雖然沒有return
echo '
$param2=='.$param2.'
'; //顯示為$param2== 因為$param2局部變數,所以不能影響全域
echo '
$param3=='.$param3.'
'; //顯示為$param3== 如果把方法裡面的return注釋去掉的話就為$param3==3
?>
5,函數傳引用2
複製代碼 代碼如下:
//傳引用
$param1 = 1;
function &add(&$param2)
{
$param2 = 2;
return $param2;
}
$param3=&add($param1);
$param4=add($param1);
echo '
$param3=='.$param3.'
'; //顯示為$param3==2
echo '
$param4=='.$param4.'
'; //顯示為$param4==2
echo '
$param1=='.$param1.'
'; //顯示為$param1==2 調用變數過程中,$param2的改變影響變數1
$param3++;
/*下面顯示為$param1==3,這是因為$param2和$param1引用到同一個地方,
* 傳回值前面加了地址符號還是一個引用$param3=&add($param1);
* 這樣$param3,$param2和$param1引用到同一個地方,當$param3++;時,
* $param1會被改變*/
echo '
$param1=='.$param1.'
';
$param4++;
/* 下面顯示為$param1==3,這裡為什麼是3而不是4呢,這是因為傳回值前面沒有
* 地址符號,它不是一個引用所以當$param4改變時不會影響$param1*/
echo '
$param1=='.$param1.'
';
?>
哈哈,不過我覺得傳引用會好一點,耗的資源少。上面測試沒有明顯的差距,可能是因為測試資料不夠大造成的,如果有更大資料來測試,我想會有明顯的不同。