国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php函數(shù)的傳值與傳址(引用)詳解

2024-09-04 11:48:15
字體:
供稿:網(wǎng)友

在php中我們函數(shù)傳值就比較簡單了,但可能有些朋友地天真無邪函數(shù)傳址或引用搞不明白,下面小編來給各位介紹在php中函數(shù)傳值與傳址(引用)介紹,希望對各位有所幫助。

php中引用的用法:

1. 變量的引用賦值: $a = &$b

2. 函數(shù)調(diào)用時的引用參數(shù)傳遞

   1) 早期php是在調(diào)用時通過&符號傳遞引用類型的變量, 比如: func(&$arg);

   2) 后來, 函數(shù)的引用類型參數(shù)被規(guī)定為需要在函數(shù)聲明時定義, 不如: function func(&$arg);

注:引用聲明時定義引用類型參數(shù)后,運行時引用參數(shù)傳遞被廢棄,需要在php.ini中增加allow_call_time_pass_reference來開啟.

3. 函數(shù)返回引用類型,這種應(yīng)用方式需要聲明函數(shù)時,在函數(shù)名前增加&符號,并且,在調(diào)用時,要用引用賦值方式, 實例代碼如下:

  1. function &func() { 
  2.     return $a
  3. $a = func();  //這種調(diào)用方式得到的不是引用傳值 
  4. $a =& func(); //這樣調(diào)用才是引用傳值 

簡而言之,就是讓函數(shù)的返回一個引用類型的值,一個更實際的例子,代碼如下:

  1. $a = 1; 
  2. function &func(&$a) { 
  3.   return $a
  4. $b = func($a); 
  5. $c =& func($a); 
  6. $b = 2; 
  7. echo "a: $a, b: $b, c: $c. <br />/n"
  8. //輸出a: 1, b: 2, c: 1. 
  9. //可見對$b的修改不會影響$a 
  10. $c = 3; 
  11. echo "a: $a, b: $b, c: $c. <br />/n"
  12. //輸出a: 3, b: 2, c: 3. 
  13. //可見對$c的修改會影響$a 

php函數(shù)傳值的幾個細節(jié),如下:

一、基本數(shù)據(jù)類型的傳值

  1. /* **************************************************** */  
  2. function testvar($k){ 
  3.  $k = 40; 
  4. $c = 30; 
  5. //給一個函數(shù)參數(shù)傳一個基本數(shù)據(jù)類型(整型,布爾,字符 ...), 實際上傳的就是值 ; 
  6. testvar($c); 
  7. echo $c;//結(jié)果是:30 
  8. function testvar2(&$k){ 
  9.  $k = 40; 
  10. $e = 30; 
  11. //給一個函數(shù)參數(shù)傳一個基本數(shù)據(jù)類型(整型,布爾,字符 ...), 實際上傳的y就是地址 ; 
  12. testvar2($e); 
  13. echo $e;//結(jié)果是:40 
  14.  
  15. /* **************************************************** */ 

二、數(shù)組(默認情況下是復制一份數(shù)據(jù)),如要傳地址則&$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);  //結(jié)果:Array ( [0] => -1 [1] => 0 [2] => 5 )  
  14. testArr($arr1); 
  15. print_r($arr1);  //結(jié)果:Array ( [0] => -1 [1] => 5 [2] => 0 )  
  16.  
  17. function testArr2(&$arr){ 
  18.  for($i=0;$i</count><count ($arr);$i++){ 
  19.   for($j=$i+1;$j<count($arr);$j++){ 
  20.    if($arr[$i]>$arr[$j]){ 
  21.     $temp = $arr[$i]; 
  22.     $arr[$i] = $arr[$j]; 
  23.     $arr[$j] = $temp
  24.    } 
  25.   } 
  26.  
  27.  } 
  28. testArr($arr1); 
  29. print_r($arr1);  //結(jié)果:Array ( [0] => -1 [1] => 0 [2] => 5 ) 
  30. /* **************************************************** */ 

三、對象數(shù)據(jù)類型傳值

  1. class person{ 
  2.  public $name
  3.  public  $age
  4.  
  5. $a = new person(); 
  6. $a->name = '小明'
  7. $a->age = '20'
  8. //變量a在存的是對象的地址,把a賦給b這個變量,實際上就是賦了一個地址。 
  9. $b = $a
  10. $b->age = 30; 
  11. //echo $a->age.$b->age;//結(jié)果是:30 30 
  12. //給一個函數(shù)參數(shù)傳一個對象, 實際上傳的是這個對象的地址; 
  13. function test($k){ 
  14.  $k->age =40; 
  15. //調(diào)用 
  16. test($b); 
  17. //echo $a->age.$b->age;//結(jié)果是:40 40 
  18. </count

php函數(shù)的傳值與傳址有什么區(qū)別呢?對于這樣的問題我喜歡通過程序演示來獲取答案,讓我們來看一個演示記錄吧!實例代碼如下:

  1. <?php     
  2.          
  3. $i=100;     
  4.          
  5. function func($n){     
  6.          
  7.    $n=$n+100;     
  8.             
  9.    return $n;     
  10.             
  11. }     
  12. echo '1)函數(shù)傳值前變量$i的值:'.$i.'<br>';     
  13. echo '2)傳值后函數(shù)的返回值:'.func($i).'<br>';     
  14. echo '3)函數(shù)傳值后變量$i的值:'.$i.'<br>';     
  15. echo '4)函數(shù)傳址前變量$i的值:'.$i.'<br>';     
  16. echo '5)傳址后函數(shù)的返回值:'.func(&$i).'<br>';     
  17. echo '6)函數(shù)傳址后變量$i的值:'.$i.'<br>';     
  18. //echo func($i).'<br>';     
  19. ?> 
  20. /* 
  21. 程序輸出: 
  22. 1)函數(shù)傳值前變量$i的值:100 
  23. 2)傳值后函數(shù)的返回值:200 
  24. 3)函數(shù)傳值后變量$i的值:100 
  25. 4)函數(shù)傳址前變量$i的值:100 
  26. 5)傳址后函數(shù)的返回值:200 
  27. 6)函數(shù)傳址后變量$i的值:200 
  28. */ 

解釋:

1)直接輸出一個賦值$i=100的變量

2)func函數(shù)傳值返回一個算術(shù)相加的結(jié)果$=100+100

3)func函數(shù)傳值,其作用區(qū)域只限于函數(shù)內(nèi)部,對外面的變量$i不會有影響

4)同上

5)func函數(shù)參數(shù)前多了個"&"符,表示傳址,和2)一樣,返回值是函數(shù)的算術(shù)運行結(jié)果。

6)func(&$i),變量指針指向$i的位置,可以理解為是對變量$i的操作,$i=$i+100;這時變量$i已經(jīng)相當于重新被賦值

如果去掉上面代碼的第18行注釋,會得什么結(jié)果呢?

小結(jié):傳址為了在執(zhí)行函數(shù)的同時,同時改變函數(shù)參數(shù)值,而傳值不期望改變.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 平度市| 河西区| 老河口市| 绥棱县| 布拖县| 永城市| 黄山市| 定州市| 云龙县| 垣曲县| 罗源县| 蒙山县| 那曲县| 亚东县| 凯里市| 会同县| 屏山县| 札达县| 西峡县| 万荣县| 当阳市| 若羌县| 博爱县| 栾城县| 确山县| 鄯善县| 巴林右旗| 邓州市| 芜湖县| 铜陵市| 东乡县| 镇雄县| 澄迈县| 舟山市| 永吉县| 昌宁县| 云林县| 息烽县| 威信县| 德庆县| 上杭县|