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. }
  4. $a = func(); //这种调用方式得到的不是引用传值
  5. $a =& func(); //这样调用才是引用传值

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

  1. $a = 1;
  2. function &func(&$a) {
  3. return $a;
  4. }
  5. $b = func($a);
  6. $c =& func($a);
  7. $b = 2;
  8. echo "a: $a, b: $b, c: $c. <br />/n";
  9. //输出a: 1, b: 2, c: 1.
  10. //可见对$b的修改不会影响$a
  11. $c = 3;
  12. echo "a: $a, b: $b, c: $c. <br />/n";
  13. //输出a: 3, b: 2, c: 3.
  14. //可见对$c的修改会影响$a

php函数传值的几个细节,如下:

一、基本数据类型的传值

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

二、数组(默认情况下是复制一份数据),如要传地址则&$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. print_r($arr); //结果:Array ( [0] => -1 [1] => 0 [2] => 5 )
  13. }
  14. testArr($arr1);
  15. print_r($arr1); //结果:Array ( [0] => -1 [1] => 5 [2] => 0 )
  16. function testArr2(&$arr){
  17. for($i=0;$i</count><count ($arr);$i++){
  18. for($j=$i+1;$j<count($arr);$j++){
  19. if($arr[$i]>$arr[$j]){
  20. $temp = $arr[$i];
  21. $arr[$i] = $arr[$j];
  22. $arr[$j] = $temp;
  23. }
  24. }
  25. }
  26. }
  27. testArr($arr1);
  28. print_r($arr1); //结果:Array ( [0] => -1 [1] => 0 [2] => 5 )
  29. /* **************************************************** */

三、对象数据类型传值

  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. //调用
  17. test($b);
  18. //echo $a->age.$b->age;//结果是:40 40
  19. </count>

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

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

解释:

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

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

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

4)同上

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

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

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

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