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.
/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函数传值的几个细节

 代码如下复制代码
//一、基本数据类型的传值

/* **************************************************** */

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函数的传值与传址有什么区别呢?对于这样的问题我喜欢通过程序演示来获取答案。让我们来看一个演示记录吧!

 代码如下复制代码
<?php

$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行注释,会得什么结果呢?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值