您好,登錄后才能下訂單哦!
小編給大家分享一下php中傳值與傳引用有什么不同,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
傳值是將變量的值復制出一份新的值;在函數范圍內,改變變量值得大小,不會影響到函數外邊的變量值。傳引用是將變量的引用復制出來一份;在函數范圍內,對值的任何改變,在函數外部也有所體現,因為傳引用傳的是內存地址。
php傳值:在函數范圍內,改變變量值得大小,都不不會影響到函數外邊的變量值。
PHP按引用:在函數范圍內,對值的任何改變,在函數外部也有所體現,因為傳引用傳的是內存地址。
傳值和傳引用、傳地址的區別:
1、傳值,是把實參的值賦值給行參
那么對行參的修改,不會影響實參的值
2、傳地址
是傳值的一種特殊方式,只是他傳遞的是地址,不是普通的如int
那么傳地址以后,實參和行參都指向同一個對象
3、傳引用
真正的以地址的方式傳遞參數
傳遞以后,行參和實參都是同一個對象,只是他們名字不同而已
對行參的修改將影響實參的值
大牛的解釋:
傳值:和copy是一樣的。【打個比方,我有一橦房子,我給你建筑材料,你建了一個根我的房子一模一樣的房子,你在你的房子做什么事都不會影響到我,我在我的房子里做什么事也不會影響到你,彼此獨立。】
<?php $testa=1; //定義變量a $testb=2; //定義變量b $testb = $testa; //變量a賦值給變量b echo $testb; //顯示為1 ?>
傳引用:類似于C語言的指針了,感覺差不多。打個比方,我有一橦房子,我給你一把鑰匙,我們二個都可以進入這個房子,你在房子做什么都會影響到我。
【優缺點:】傳值會很耗時間,特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作,傳送引用,函數內的任何操作等同于對傳送變量的操作,傳送大型變量時效率高!
1.先來解釋一下名詞。
值傳遞(passl-by-value)過程中,被調函數的形式參數作為被調函數的局部變量處理,即在堆棧中開辟了內存空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。
引用傳遞(pass-by-reference)過程中,被調函數的形式參數雖然也作為局部變量在堆棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的。
注意:上面紅字部分說明,應用傳遞不是不開辟空間,是開辟空間的,只不過開辟的空間是用來存放實參變量地址的。
2.php中引用的用法有以下三種。
①. 變量的引用賦值: $a = &$b
②. 函數調用時的引用參數傳遞
1) 早期php是在調用時通過&符號傳遞引用類型的變量, 比如: func(&$arg);
2) 后來, 函數的引用類型參數被規定為需要在函數聲明時定義, 不如: function func(&$arg);
注意:引用聲明時定義引用類型參數后,運行時引用參數傳遞被廢棄,需要在php.ini中增加allow_call_time_pass_reference來開啟.
③. 函數返回引用類型,這種應用方式需要聲明函數時,在函數名前增加&符號,并且,在調用時,要用引用賦值方式, 實例代碼如下:
function &func() { return $a; } $a = func(); //這種調用方式得到的不是引用傳值 $a =& func(); //這樣調用才是引用傳值
$a = 1; function &func(&$a) { return $a; } $b = func($a); $c =& func($a); $b = 2; echo "a: $a, b: $b, c: $c. <br />/n"; //輸出a: 1, b: 2, c: 1. //可見對$b的修改不會影響$a $c = 3; echo "a: $a, b: $b, c: $c. <br />/n"; //輸出a: 3, b: 2, c: 3. //可見對$c的修改會影響$a
請看下面詳細的例子:
3.php各種數據類型傳值/指針
一、基本數據類型的傳值
/* **************************************************** */ function testvar($k){ $k = 40; } $c = 30; //給一個函數參數傳一個基本數據類型(整型,布爾,字符 ...), 實際上傳的就是值 ; testvar($c); echo $c;//結果是:30 function testvar2(&$k){ $k = 40; } $e = 30; //給一個函數參數傳一個基本數據類型(整型,布爾,字符 ...), 實際上傳的y就是地址 ; testvar2($e); echo $e;//結果是:40 /* **************************************************** */
二、數組(默認情況下是復制一份數據),如要傳地址則&$arr
1 $arr1 = array(-1,5,0); 2 function testArr($arr){ 3 for($i=0;$i<count ($arr);$i++){ 4 for($j=$i+1;$j<count($arr);$j++){ 5 if($arr[$i]>$arr[$j]){ 6 $temp = $arr[$i]; 7 $arr[$i] = $arr[$j]; 8 $arr[$j] = $temp; 9 } 10 } 11 12 } 13 print_r($arr); //結果:Array ( [0] => -1 [1] => 0 [2] => 5 ) 14 } 15 testArr($arr1); 16 print_r($arr1); //結果:Array ( [0] => -1 [1] => 5 [2] => 0 ) 17 18 function testArr2(&$arr){ 19 for($i=0;$i</count><count ($arr);$i++){ 20 for($j=$i+1;$j<count($arr);$j++){ 21 if($arr[$i]>$arr[$j]){ 22 $temp = $arr[$i]; 23 $arr[$i] = $arr[$j]; 24 $arr[$j] = $temp; 25 } 26 } 27 28 } 29 } 30 testArr($arr1); 31 print_r($arr1); //結果:Array ( [0] => -1 [1] => 0 [2] => 5 )
三、對象數據類型傳值
class person{ public $name; public $age; } $a = new person(); $a->name = '小明'; $a->age = '20'; //變量a在存的是對象的地址,把a賦給b這個變量,實際上就是賦了一個地址。 $b = $a; $b->age = 30; //echo $a->age.$b->age;//結果是:30 30 //給一個函數參數傳一個對象, 實際上傳的是這個對象的地址; function test($k){ $k->age =40; } //調用 test($b); //echo $a->age.$b->age;//結果是:40 40
在PHP5中 對象的復制 是通過引用來實現的。上列中$a=new person; $b=$a; 其實等效于$a=new person; $b=&$a;
PHP5中默認就是通過引用來調用對象, 但有時你可能想建立一個對象的副本,并希望原來的對象的改變不影響到副本 . 為了這樣的目的,PHP定義了一個特殊的方法,稱為__clone.
4.php寫時拷貝
php中對于地址的指向(類似指針)功能不是由用戶自己來實現的,是由Zend核心實現的,php中引用采用的是“寫時拷貝”的原理,就是除非發生寫操作,指向同一個地址的變量或者對象是不會被拷貝的。
通俗的講
1:如果有下面的代碼
$a="ABC"; $b=$a;
其實此時$a與$b都是指向同一內存地址而并不是$a與$b占用不同的內存
2:如果在上面的代碼基礎上再加上如下代碼
$a="EFG";
由于$a與$b所指向的內存的數據要重新寫一次了,此時Zend核心會自動判斷自動為$b生產一個$a的數據拷貝,重新申請一塊內存進行存儲。
5.php引用于C指針的區別
在PHP 中引用的意思是:不同的名字訪問同一個變量內容.
與C語言中的指針是有差別的.C語言中的指針里面存儲的是變量的內容在內存中存放的地址。
PHP 的引用允許你用兩個變量來指向同一個內容
$a="ABC"; $b =&$a; echo $a;//這里輸出:ABC echo $b;//這里輸出:ABC $b="EFG"; echo $a;//這里$a的值變為EFG 所以輸出EFG echo $b;//這里輸出EFG
當你 unset 一個引用,只是斷開了變量名和變量內容之間的綁定。這并不意味著變量內容被銷毀了。例如:
unset($a); echo $b;//這里輸出EFG
以上是php中傳值與傳引用有什么不同的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。