[英]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.