通過5個(gè)php實(shí)例細(xì)致說(shuō)明傳值與傳引用的區(qū)別
更新時(shí)間:2012年08月08日 17:31:20 作者:
今天有個(gè)同事問我傳值和傳引用有什么不同,這讓我想起了,剛學(xué)php的時(shí)候,那個(gè)時(shí)候做過很多項(xiàng)目,做東西多,就以為自己php掌握的差不多了,隨著時(shí)間的推移,越深入的學(xué)習(xí),越覺得自己知道的真的很少,很少
哈哈,會(huì)用只是初級(jí)階段,要了解原理是什么,這樣才能更好去運(yùn)用,費(fèi)話不多說(shuō)
傳值:是把實(shí)參的值賦值給行參 ,那么對(duì)行參的修改,不會(huì)影響實(shí)參的值
傳引用 :真正的以地址的方式傳遞參數(shù)傳遞以后,行參和實(shí)參都是同一個(gè)對(duì)象,只是他們名字不同而已對(duì)行參的修改將影響實(shí)參的值
說(shuō)明:
傳值:根copy是一樣的。打個(gè)比方,我有一橦房子,我給你建筑材料,你建了一個(gè)根我的房子一模一樣的房子,你在你的房子做什么事都不會(huì)影響到我,我在我的房子里做什么事也不會(huì)影響到你,彼此獨(dú)立。
傳引用:讓我想起了上大學(xué)時(shí)學(xué)習(xí)C語(yǔ)言的指針了,感覺差不多。打個(gè)比方,我有一橦房子,我給你一把鑰匙,我們二個(gè)都可以進(jìn)入這個(gè)房子,你在房子做什么都會(huì)影響到我。
一,php實(shí)例
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,函數(shù)傳值
<?php
//傳值
$param1 = 1; //定義變量1
function add($param2) //傳參數(shù)
{
$param2=3; //把3賦值給變量2
}
$param3=add($param1); //調(diào)用方法add,并將變量1傳給變量2
echo '<br>$param1=='.$param1.'<br>'; //顯示為$param1==1
echo '<br>$param2=='.$param2.'<br>'; //顯示為$param2== 因?yàn)?param2是局部變量,所以不能影響全局
echo '<br>$param3=='.$param3.'<br>'; //顯示為$param3== 因?yàn)閍dd方法沒有返回值,所以$param3為空
?>
4,函數(shù)傳引用
<?php
//傳值
$param1 = 1; //定義變量1
function add(&$param2) //傳參數(shù)
{
$param2=3; //把3賦值給變量2
// return $param2; //返回變量2
}
echo '<br>$param1=='.$param1.'<br>'; //顯示為$param1==1 沒對(duì)變量1進(jìn)行操作
$param3=add($param1); //調(diào)用方法add,并將變量1的引用傳給變量2
echo '<br>$param1=='.$param1.'<br>'; //顯示為$param1==3 調(diào)用變量過程中,$param2的改變影響變量1,雖然沒有return
echo '<br>$param2=='.$param2.'<br>'; //顯示為$param2== 因?yàn)?param2局部變量,所以不能影響全局
echo '<br>$param3=='.$param3.'<br>'; //顯示為$param3== 如果把方法里面的return注釋去掉的話就為$param3==3
?>
5,函數(shù)傳引用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 調(diào)用變量過程中,$param2的改變影響變量1
$param3++;
/*下面顯示為$param1==3,這是因?yàn)?param2和$param1引用到同一個(gè)地方,
* 返回值前面加了地址符號(hào)還是一個(gè)引用$param3=&add($param1);
* 這樣$param3,$param2和$param1引用到同一個(gè)地方,當(dāng)$param3++;時(shí),
* $param1會(huì)被改變*/
echo '<br>$param1=='.$param1.'<br>';
$param4++;
/* 下面顯示為$param1==3,這里為什么是3而不是4呢,這是因?yàn)榉祷刂登懊鏇]有
* 地址符號(hào),它不是一個(gè)引用所以當(dāng)$param4改變時(shí)不會(huì)影響$param1*/
echo '<br>$param1=='.$param1.'<br>';
?>
哈哈,不過我覺得傳引用會(huì)好一點(diǎn),耗的資源少。上面測(cè)試沒有明顯的差距,可能是因?yàn)闇y(cè)試數(shù)據(jù)不夠大造成的,如果有更大數(shù)據(jù)來(lái)測(cè)試,我想會(huì)有明顯的不同。
傳值:是把實(shí)參的值賦值給行參 ,那么對(duì)行參的修改,不會(huì)影響實(shí)參的值
傳引用 :真正的以地址的方式傳遞參數(shù)傳遞以后,行參和實(shí)參都是同一個(gè)對(duì)象,只是他們名字不同而已對(duì)行參的修改將影響實(shí)參的值
說(shuō)明:
傳值:根copy是一樣的。打個(gè)比方,我有一橦房子,我給你建筑材料,你建了一個(gè)根我的房子一模一樣的房子,你在你的房子做什么事都不會(huì)影響到我,我在我的房子里做什么事也不會(huì)影響到你,彼此獨(dú)立。
傳引用:讓我想起了上大學(xué)時(shí)學(xué)習(xí)C語(yǔ)言的指針了,感覺差不多。打個(gè)比方,我有一橦房子,我給你一把鑰匙,我們二個(gè)都可以進(jìn)入這個(gè)房子,你在房子做什么都會(huì)影響到我。
一,php實(shí)例
1,傳值
復(fù)制代碼 代碼如下:
<?php
$param1=1; //定義變量1
$param2=2; //定義變量2
$param2 = $param1; //變量1賦值給變量2
echo $param2; //顯示為1
?>
2,傳引用
復(fù)制代碼 代碼如下:
<?php
$param2=1; //定義變量2
$param1 = &$param2; //將變量2的引用傳給變量1
echo $param2; //顯示為1
$param1 = 2; //把2賦值給變量1
echo $param2; //顯示為2
?>
3,函數(shù)傳值
復(fù)制代碼 代碼如下:
<?php
//傳值
$param1 = 1; //定義變量1
function add($param2) //傳參數(shù)
{
$param2=3; //把3賦值給變量2
}
$param3=add($param1); //調(diào)用方法add,并將變量1傳給變量2
echo '<br>$param1=='.$param1.'<br>'; //顯示為$param1==1
echo '<br>$param2=='.$param2.'<br>'; //顯示為$param2== 因?yàn)?param2是局部變量,所以不能影響全局
echo '<br>$param3=='.$param3.'<br>'; //顯示為$param3== 因?yàn)閍dd方法沒有返回值,所以$param3為空
?>
4,函數(shù)傳引用
復(fù)制代碼 代碼如下:
<?php
//傳值
$param1 = 1; //定義變量1
function add(&$param2) //傳參數(shù)
{
$param2=3; //把3賦值給變量2
// return $param2; //返回變量2
}
echo '<br>$param1=='.$param1.'<br>'; //顯示為$param1==1 沒對(duì)變量1進(jìn)行操作
$param3=add($param1); //調(diào)用方法add,并將變量1的引用傳給變量2
echo '<br>$param1=='.$param1.'<br>'; //顯示為$param1==3 調(diào)用變量過程中,$param2的改變影響變量1,雖然沒有return
echo '<br>$param2=='.$param2.'<br>'; //顯示為$param2== 因?yàn)?param2局部變量,所以不能影響全局
echo '<br>$param3=='.$param3.'<br>'; //顯示為$param3== 如果把方法里面的return注釋去掉的話就為$param3==3
?>
5,函數(shù)傳引用2
復(fù)制代碼 代碼如下:
<?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 調(diào)用變量過程中,$param2的改變影響變量1
$param3++;
/*下面顯示為$param1==3,這是因?yàn)?param2和$param1引用到同一個(gè)地方,
* 返回值前面加了地址符號(hào)還是一個(gè)引用$param3=&add($param1);
* 這樣$param3,$param2和$param1引用到同一個(gè)地方,當(dāng)$param3++;時(shí),
* $param1會(huì)被改變*/
echo '<br>$param1=='.$param1.'<br>';
$param4++;
/* 下面顯示為$param1==3,這里為什么是3而不是4呢,這是因?yàn)榉祷刂登懊鏇]有
* 地址符號(hào),它不是一個(gè)引用所以當(dāng)$param4改變時(shí)不會(huì)影響$param1*/
echo '<br>$param1=='.$param1.'<br>';
?>
哈哈,不過我覺得傳引用會(huì)好一點(diǎn),耗的資源少。上面測(cè)試沒有明顯的差距,可能是因?yàn)闇y(cè)試數(shù)據(jù)不夠大造成的,如果有更大數(shù)據(jù)來(lái)測(cè)試,我想會(huì)有明顯的不同。
您可能感興趣的文章:
相關(guān)文章
Laravel實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼
本篇文章主要介紹了Laravel實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-08-08ThinkPHP有變量的where條件分頁(yè)實(shí)例
這篇文章主要介紹了ThinkPHP有變量的where條件分頁(yè)方法,實(shí)例講述了ThinkPHP條件查詢與分頁(yè)的技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11使用php偽造referer的方法 利用referer防止圖片盜鏈
當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁(yè)面鏈接過來(lái)的,服務(wù)器籍此可以獲得一些信息用于處理,不過這個(gè)Referer是可以偽造,下面看一個(gè)示例,大家就明白了2014-01-01用PHP的socket實(shí)現(xiàn)客戶端到服務(wù)端的通信實(shí)例詳解
本篇文章主要介紹了用PHP的socket實(shí)現(xiàn)客戶端到服務(wù)端的通信實(shí)例詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02