繁体   English   中英

PHP函数返回数组:为什么我必须通过引用传递?

[英]Php function to return array: why I have to pass by reference?

我是从Java来的Php,我不明白为什么要在Php中获取,转换和返回数组,您必须在foreach()中使用“&”(也称为“引用”)符号...

       $some_array = array(1, 2, 3);



       function test($a) {
           foreach ($a as $k => &$v) {
               $v = 'Hello!';
           };
           return $a;
       };

       $result = test($some_array);


       var_dump($result); // array('Hello!', 'Hello!', 'Hello!');

但是有:

 function test($a) {
           foreach ($a as $k => $v) {
               $v = 'Hello!';
           };
           return $a;
       };

[...]

var_dump($result); // array(1, 2, 3)

要了解什么是“按值传递”和“按引用传递”,您应该阅读docs

默认情况下,函数参数是按值传递的(因此,如果函数中参数的值发生更改,则不会在函数外部进行更改)。 要允许函数修改其参数,必须通过引用将其传递。

要使函数的参数始终通过引用传递,请在函数定义中的参数名称前加上“&”号。

关于foreach构造的文档还指出

为了能够直接在循环中修改数组元素,在$value之前加上& 在这种情况下,该值将通过引用分配。

您可以选择按引用传递并直接更改值( &$v ),也可以选择按值传递,但是在这种情况下,必须使用$k的元素键来更改数组值:

foreach ($a as $k => $v)
{
    $a[$k] = 'Hello!';
};

如果仅将数组传递给foreach而不使用引用& ,则将数组的副本传递给foreach。

然后,当您对阵列(副本)进行更改时,便对副本进行了更改。 一旦foreach完成,当然会丢弃该副本。

因此,当在foreach完成后返回$a时,实际上是返回作为参数传递给函数的副本,该副本不变。

即使您要通过引用将数组传递给函数,也不会有任何区别,因为它是制作一次性副本或使用原始数组的foreach,具体取决于实际中&引用指令的使用foreach代码行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM