php函数的传值及传址详解
发布时间:2023-10-26 12:07:29 所属栏目:PHP教程 来源:网络
导读: php中引用的用法:
1. 变量的引用赋值: $a = &$b
2. 函数调用时的引用参数传递
1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$ar
1. 变量的引用赋值: $a = &$b
2. 函数调用时的引用参数传递
1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$ar
php中引用的用法: 1. 变量的引用赋值: $a = &$b 2. 函数调用时的引用参数传递 1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$arg); 2) 后来, 函数的引用类型参数被规定为需要在函数声明时定义, 不如: function func(&$arg); 注: 引用声明时定义引用类型参数后, 运行时引用参数传递被废弃, 需要在php.ini中增加allow_call_time_pass_reference来开启. 3. 函数返回引用类型, 这种应用方式需要声明函数时, 在函数名前增加&符号, 并且, 在调用时, 要用引用赋值方式, 比如: 代码如下 1 function &func() { return $a; } $a = func(); //这种调用方式得到的不是引用传值 $a =& func(); //这样调用才是引用传值 简而言之, 就是让函数的返回一个引用类型的值, 一个更实际的例子: 代码如下 1 $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函数传值的几个细节 代码如下 1 //一、基本数据类型的传值 /* **************************************************** */ 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 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函数的传值与传址有什么区别呢?对于这样的问题我喜欢通过程序演示来获取答案。让我们来看一个演示记录吧! 代码如下 1 $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行注释,会得什么结果呢? 小结:传址为了在执行函数的同时,同时改变函数参数值,而传值不期望改变。 (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐