传值是将变量的值复制出一份新的值;在函数范围内,改变变量值得大小,不会影响到函数外边的变量值。传引用是将变量的引用复制出来一份;在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
推荐:《PHP视频教程》
php传值:在函数范围内,改变变量值得大小,都不不会影响到函数外边的变量值。
PHP按引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
传值和传引用、传地址的区别:
1、传值,是把实参的值赋值给行参
那么对行参的修改,不会影响实参的值
2、传地址
是传值的一种特殊方式,只是他传递的是地址,不是普通的如int
那么传地址以后,实参和行参都指向同一个对象
3、传引用
真正的以地址的方式传递参数
传递以后,行参和实参都是同一个对象,只是他们名字不同而已
对行参的修改将影响实参的值
大牛的解释:
传值:和copy是一样的。【打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。】
<?php $testa=1; //定义变量a $testb=2; //定义变量b $testb = $testa; //变量a赋值给变量b echo $testb; //显示为1 ?>
传引用:类似于C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。
【优缺点:】传值会很耗时间,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作,传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高!
1.先来解释一下名词。
值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的。
注意:上面红字部分说明,应用传递不是不开辟空间,是开辟空间的,只不过开辟的空间是用来存放实参变量地址的。
2.php中引用的用法有以下三种。
①. 变量的引用赋值: $a = &$b
②. 函数调用时的引用参数传递
1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$arg);
2) 后来, 函数的引用类型参数被规定为需要在函数声明时定义, 不如: function func(&$arg);
注意:引用声明时定义引用类型参数后,运行时引用参数传递被废弃,需要在php.ini中增加allow_call_time_pass_reference来开启.
③. 函数返回引用类型,这种应用方式需来源gao.dai.ma.com搞@代*码网要声明函数时,在函数名前增加&符号,并且,在调用时,要用引用赋值方式, 实例代码如下:
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