传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值
传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值
说明:
传值:根copy是一样的。打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。
传引用:让我想起了上大学时学习C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。
看图
下面是几个例子
(1)普通传值引用
$param1=1;
$param2=2;
$param2 = &$param1; //把变量1的内存地址赋给变量2;此时的变量2和变量1全等;
echo $param2;// 1
$param1 = 5; //变量1和变量2是一处内存(也就是他们的引用地址是一样的),改变其中一个,另外一个也被改变;
echo $param2; //显示为5
(2) 函数传值引用
$param1 = 1;
$param2 = ''; //定义变量1
function add(&$param2) //传参数
{
$param2=3; //把3赋值给变量2
//return $param2; //返回变量2
}
echo $param1; //1
$param3=add($param1); //调用方法add,并将变量1的引用传给变量2
echo $param3;//3
echo $param1;//3
echo $param2;// ''
给数组里面的键值各增加10;
$arr = array(3,5);
foreach($arr as $k=>$v){
$v+=10;//1.更改无效,相当于遍历出的键值扔给变量$v,然后更改变量$v的值,跟数组无关;
echo $v." ";//输出13 15;
}
foreach($arr as $k=>$v){
$arr[$k]+=10;//2.更改有效,直接更改键名里面的值;
echo $v;//输出3,5;
}
foreach($arr as &$v){
$v+=10;//3.更改有效,遍历的键值直接给了$v的地址,这个地址其实就是键名..$v+10就等于$arr[$k]+10;
}
$a = 1;
$b = &$a;
unset($a);
echo $b; //1
unset并没有真正销毁变量的作用...仅仅是切断了变量与内存之间的关系,内存只要还被引用着就不会被释放;
$b和$a同时指向1,切断其中$a的关系,$b还是指向1,所以上题不报错,照样输出1。