返回数组的Php函数:为什么我要通过引用传递?

时间:2017-01-30 12:50:00

标签: php arrays reference

我从Javascript来到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)

2 个答案:

答案 0 :(得分:3)

要了解“通过值传递”和“通过引用传递”的内容,您应该阅读the docs

  

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

     

要使函数的参数始终通过引用传递,请在函数定义中为参数名称添加&符号(&)。

foreach上的文档构建also states

  

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

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

$k

答案 1 :(得分:3)

如果您只是将数组传递给foreach而不使用引用public class TestUncheck { public static Runnable uncheck(Callable<Void> r) { return () -> { try { r.call(); } catch (Exception e) { throw new RuntimeException(e); } }; } public static void main(String[] args) { new Thread(uncheck( () -> { System.out.println("Zzz"); Thread.sleep(1000); return null; } )).start(); } } ,那么您将把数组的副本传递给foreach。

然后,当您对阵列(副本)进行更改时,您将对副本进行更改。当foreach结束时,课程的副本将被丢弃。

因此,当foreach完成后返回&时,实际上是将返回传递给函数的副本作为参数,该副本未更改。

即使您通过引用将数组传递给函数也没有区别,因为它是使用一次性副本或使用原始数组的foreach,具体取决于{{1在实际的foreach代码行中引用指令。