网站地图    收藏   

主页 > php专栏 > php函数大全 >

php函数的传值与传址(引用)详解 - php函数

来源:自学PHP网    时间:2014-11-25 00:27 作者: 阅读:

[导读] 在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍...

php函数的传值与传址(引用)详解

在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助。

php中引用的用法:

1. 变量的引用赋值: $a = &$b

2. 函数调用时的引用参数传递

   1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$arg);

   2) 后来, 函数的引用类型参数被规定为需要在函数声明时定义, 不如: function func(&$arg);

注:引用声明时定义引用类型参数后,运行时引用参数传递被废弃,需要在php.ini中增加allow_call_time_pass_reference来开启.

3. 函数返回引用类型,这种应用方式需要声明函数时,在函数名前增加&符号,并且,在调用时,要用引用赋值方式, 实例代码如下:

  1. function &func() { 
  2.     return $a
  3. $a = func();  //这种调用方式得到的不是引用传值 
  4. $a =& func(); //这样调用才是引用传值 

简而言之,就是让函数的返回一个引用类型的值,一个更实际的例子,代码如下:

  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函数传值的几个细节,如下:

一、基本数据类型的传值

  1. /* **************************************************** */  
  2. function testvar($k){ 
  3.  $k = 40; 
  4. $c = 30; 
  5. //给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的就是值 ; 
  6. testvar($c); 
  7. echo $c;//结果是:30 
  8. function testvar2(&$k){ 
  9.  $k = 40; 
  10. $e = 30; 
  11. //给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的y就是地址 ; 
  12. testvar2($e); 
  13. echo $e;//结果是:40 
  14.  
  15. /* **************************************************** */ 

二、数组(默认情况下是复制一份数据),如要传地址则&$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. testArr($arr1); 
  15. print_r($arr1);  //结果: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);  //结果:Array ( [0] => -1 [1] => 0 [2] => 5 ) 
  30. /* **************************************************** */ 

三、对象数据类型传值

  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;//结果是:30 30 
  12. //给一个函数参数传一个对象, 实际上传的是这个对象的地址; 
  13. function test($k){ 
  14.  $k->age =40; 
  15. //调用 
  16. test($b); 
  17. //echo $a->age.$b->age;//结果是:40 40 
  18. </count

php函数的传值与传址有什么区别呢?对于这样的问题我喜欢通过程序演示来获取答案,让我们来看一个演示记录吧!实例代码如下:

  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)函数传值前变量$i的值:'.$i.'<br>';     
  13. echo '2)传值后函数的返回值:'.func($i).'<br>';     
  14. echo '3)函数传值后变量$i的值:'.$i.'<br>';     
  15. echo '4)函数传址前变量$i的值:'.$i.'<br>';     
  16. echo '5)传址后函数的返回值:'.func(&$i).'<br>';     
  17. echo '6)函数传址后变量$i的值:'.$i.'<br>';     
  18. //echo func($i).'<br>';     
  19. ?> 
  20. /* 
  21. 程序输出: 
  22. 1)函数传值前变量$i的值:100 
  23. 2)传值后函数的返回值:200 
  24. 3)函数传值后变量$i的值:100 
  25. 4)函数传址前变量$i的值:100 
  26. 5)传址后函数的返回值:200 
  27. 6)函数传址后变量$i的值:200 
  28. */ 

解释:

1)直接输出一个赋值$i=100的变量

2)func函数传值返回一个算术相加的结果$=100+100

3)func函数传值,其作用区域只限于函数内部,对外面的变量$i不会有影响

4)同上

5)func函数参数前多了个"&"符,表示传址,和2)一样,返回值是函数的算术运行结果。

6)func(&$i),变量指针指向$i的位置,可以理解为是对变量$i的操作,$i=$i+100;这时变量$i已经相当于重新被赋值

如果去掉上面代码的第18行注释,会得什么结果呢?

小结:传址为了在执行函数的同时,同时改变函数参数值,而传值不期望改变.

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论