2026-03-26 19:03:58

大家好,今天小编关注到一个比较有意思的话题,就是关于php引用传递的问题,于是小编就整理了3个相关介绍php引用传递的解答,让我们一起看看吧。

PHP传值和传引用,传地址的区别?

传值和传引用、传地址的区别:

php引用传递,php引用传递和值传递的区别

1、传值,是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值

2、传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象

3、传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值

PHP传值,引用和传址的区别?

实参(被调)、行参(主调)

  函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

  --传值:

  是把实参的值赋值给行参,相当于复制一块同样的空间那么对行参的修改,不会影响实参的值

  --传地址:

  是传值的一种特殊方式,只是他传递的是地址,不是普通的如int那么传地址以后,实参和行参都指向同一个对象--传引用:

  真正的以地址的方式传递参数

  传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值

  即传址时只需在函数调用时在参数的前面加上"&"号即可。将函数外部的值的内存地址传递给内部的参数,在函数内部的所有操作都会改变函数外部参数的值。

  值传递(passl-by-value): 压栈的是参数的副本。任何的修改是在副本上作用,没有作用在原来的变量上。

  过程中:被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

  传指针(pointer): 压栈的是指针变量的副本。当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。

  引用传递(pass-by-reference):压栈的是引用的副本。由于引用是指向某个变量的,对引用的操作其实就是对他指向的变量的操作。

  过程中:被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

  所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。

  所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。如果对目标对象进行修改,内存中的数据也会改变。

PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么?

HP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么?

代码如下:

$arr = array('one','two','three');

foreach ($arr as &$value){ echo 'Value:'.$value.'

'; }

foreach ($arr as $value){ echo 'Value:'.$value.'

'; }

?>

输出结果:

Value:one

Value:two

Value:three

Value:one

Value:two

Value:two

第一次带&的foreach并没有改变数组的内容。。

而是最后一次循环$value引用了数组的最后一个项 (可以测试一下,在第一次循环结束后unset($value),第二次循环的结果就不会有变化),

在你第二个foreach也是使用的$value变量,这才造成了怪异的问题(可以换个变量,比如$val,输出的数组就不会有变化)。

第二个foreach是赋值给$value,但是这时的$value是引用的数组的最后一个值,

所以

第一次循环把one赋值给了最后一个值,

第二次把two赋值给最后一个,

第三次也就是最后一个已经在第二次循环被赋值为two,所以仍然是two。

到此,以上就是小编对于php引用传递的问题就介绍到这了,希望介绍关于php引用传递的3点解答对大家有用。

上一篇:php加解密,php加解密函数

下一篇:php tp框架,Php tp框架

相关阅读