在php中我們函數傳值就比較簡單了,但可能有些朋友地天真無邪函數傳址或引用搞不明白,下面小編來給各位介紹在php中函數傳值與傳址(引用)介紹,希望對各位有所協助。
php中引用的用法:
1. 變數的引用賦值: $a = &$b
2. 函數調用時的引用參數傳遞
1) 早期php是在調用時通過&符號傳遞參考型別的變數, 比如: func(&$arg);
2) 後來, 函數的參考型別參數被規定為需要在函式宣告時定義, 不如: function func(&$arg);
注: 引用聲明時定義參考型別參數後, 運行時引用參數傳遞被廢棄, 需要在php.ini中增加allow_call_time_pass_reference來開啟.
3. 函數返回參考型別, 這種應用方式需要聲明函數時, 在函數名前增加&符號, 並且, 在調用時, 要用引用賦值方式, 比如:
| 代碼如下 |
複製代碼 |
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. /n"; //輸出a: 1, b: 2, c: 1. //可見對$b的修改不會影響$a $c = 3; echo "a: $a, b: $b, c: $c. /n"; //輸出a: 3, b: 2, c: 3. //可見對$c的修改會影響$a |
php函數傳值的幾個細節
| 代碼如下 |
複製代碼 |
//一、基礎資料型別 (Elementary Data Type)的傳值 /* **************************************************** */ function testvar($k){ $k = 40; } $c = 30; //給一個函數參數傳一個基礎資料型別 (Elementary Data Type)(整型,布爾,字元 ...), 實際上傳的就是值 ; testvar($c); echo $c;//結果是:30 function testvar2(&$k){ $k = 40; } $e = 30; //給一個函數參數傳一個基礎資料型別 (Elementary Data Type)(整型,布爾,字元 ...), 實際上傳的y就是地址 ; testvar2($e); echo $e;//結果是:40 /* **************************************************** */ //二、數組(預設情況下是複製一份資料),如要傳地址則&$arr. $arr1 = array(-1,5,0); function testArr($arr){ for($i=0;$i for($j=$i+1;$j if($arr[$i]>$arr[$j]){ $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } } } print_r($arr); //結果:Array ( [0] => -1 [1] => 0 [2] => 5 ) } testArr($arr1); print_r($arr1); //結果:Array ( [0] => -1 [1] => 5 [2] => 0 ) function testArr2(&$arr){ for($i=0;$i for($j=$i+1;$j if($arr[$i]>$arr[$j]){ $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } } } } testArr($arr1); 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
|
php函數的傳值與傳址有什麼區別呢?對於這樣的問題我喜歡通過程式示範來擷取答案。讓我們來看一個示範記錄吧!
| 代碼如下 |
複製代碼 |
$i=100; function func($n){ $n=$n+100; return $n; } echo '1)函數傳值前變數$i的值:'.$i.' '; echo '2)傳值後函數的傳回值:'.func($i).' '; echo '3)函數傳值後變數$i的值:'.$i.' '; echo '4)函數傳址前變數$i的值:'.$i.' '; echo '5)傳址後函數的傳回值:'.func(&$i).' '; echo '6)函數傳址後變數$i的值:'.$i.' '; //echo func($i).' '; ?> |
程式輸出:
1)函數傳值前變數$i的值:100
2)傳值後函數的傳回值:200
3)函數傳值後變數$i的值:100
4)函數傳址前變數$i的值:100
5)傳址後函數的傳回值:200
6)函數傳址後變數$i的值:200
解釋:
1)直接輸出一個賦值$i=100的變數
2)func函數傳值返回一個算術相加的結果$=100+100
3)func函數傳值,其作用地區只限於函數內部,對外面的變數$i不會有影響
4)同上
5)func函數參數前多了個"&"符,表示傳址,和2)一樣,傳回值是函數的算術運行結果。
6)func(&$i),變數指標指向$i的位置,可以理解為是對變數$i的操作,$i=$i+100;這時變數$i已經相當於重新被賦值
如果去掉上面代碼的第18行注釋,會得什麼結果呢?
小結:傳址為了在執行函數的同時,同時改變函數參數值,而傳值不期望改變。
http://www.bkjia.com/PHPjc/632691.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632691.htmlTechArticle在php中我們函數傳值就比較簡單了,但可能有些朋友地天真無邪函數傳址或引用搞不明白,下面小編來給各位介紹在php中函數傳值與傳址(引...