简单的来说:
传值:当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量;
php传值:在函数范围内,改变变量值得大小,都不不会影响到函数外边的变量值。
打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。
<?php
$testa=1; //定义变量a
$testb=2; //定义变量b
$testb = $testa; //变量a赋值给变量b
echo $testb; //显示为1
?>
是把实参的值赋值给行参
那么对行参的修改,不会影响实参的值
函数参数压栈的是参数的副本。
任何的修改是在副本上作用,没有作用在原来的变量上。
变量默认是传值;
传引用:当一个变量的值赋予另外一个变量时,改动新的变量将影响原始的变量;使用引用赋值,简单的就是将&符号加到将要赋值的变量前;相当于别名;
PHP按引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。
<?php
$param2=1; //定义变量2
$param1 = &$param2; //将变量2的引用传给变量1
echo $param2; //显示为1
$param1 = 2; //把2赋值给变量1
echo $param2; //显示为2
?>
真正的以地址的方式传递参数
传递以后,行参和实参都是同一个对象,只是他们名字不同而已
对行参的修改将影响实参的值
压栈的是引用的副本。由于引用是指向某个变量的,对引用的操作其实就是对他指向的变量的操作。(作用和传指针一样,只是引用少了解指针的草纸)
对象默认是传引用;
使用场景:对于较大的数据,传引用比较好,可以节省内存开销;
优缺点:
传值会很耗时间,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作,
传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高!
函数参数传递机制的基本理论
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。
值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。