好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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  

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.

$arr1  =  array (-1,5,0);  function  testArr( $arr ){    for ( $i =0; $i < count  ( $arr ); $i ++){     for ( $j = $i +1; $j < count ( $arr ); $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 </ count >< count  ( $arr ); $i ++){     for ( $j = $i +1; $j < count ( $arr ); $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   </ count > 

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

<?php                $i =100;                function  func( $n ){                    $n = $n +100;                       return   $n ;                   }      echo   '1)函数传值前变量$i的值:' . $i . '<br>' ;      echo   '2)传值后函数的返回值:' .func( $i ). '<br>' ;      echo   '3)函数传值后变量$i的值:' . $i . '<br>' ;      echo   '4)函数传址前变量$i的值:' . $i . '<br>' ;      echo   '5)传址后函数的返回值:' .func(& $i ). '<br>' ;      echo   '6)函数传址后变量$i的值:' . $i . '<br>' ;      //echo func($i).'<br>';       ?>  /*   程序输出:   1)函数传值前变量$i的值:100   2)传值后函数的返回值:200   3)函数传值后变量$i的值:100   4)函数传址前变量$i的值:100   5)传址后函数的返回值:200   6)函数传址后变量$i的值:200   */  

解释:

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

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

4)同上

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

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

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

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

查看更多关于php函数的传值与传址(引用)详解 - php函数的详细内容...

  阅读:44次