PHP:将引用插入数组?

And*_*bel 7 php reference

我想在某个点插入一个数组:

$hi = "test";
$var2 = "next";
$arr = array(&$hi);
$arr[] = &$var2; // this works
array_splice($arr, 1, 0, &$var2); // this doesn't
Run Code Online (Sandbox Code Playgroud)

为什么尝试将它插入到数组中并且使用第一种方法并没有使用第一种方法?

Kin*_*pus 6

快速而肮脏的答案,但请注意,不推荐使用引用调用此函数,并且可能(取决于您的php配置)生成警告:

array_splice($arr, 1, 0, array(&$var2));
Run Code Online (Sandbox Code Playgroud)

这个怎么样的回答:发生的事情非常微妙.当您进行拼接时,因为您已将引用插入到该位置,所以实际上正在重新分配$ var2.您可以使用以下代码进行验证:

<?php
  $hi = "test";
  $var2 = "next";
  $arr = array(&$hi);
  $arr[] = &$var2; // this works
  printf("=== var2 before splice:\n%s\n", var_export($var2, TRUE));
  array_splice($arr, 1, 0, &$var2); // this doesn't
  printf("=== var2 after splice:\n%s\n", var_export($var2, TRUE));
?>
Run Code Online (Sandbox Code Playgroud)

您将获得以下结果:

=== var2 before splice:
'next'
=== var2 after splice:
array (
  0 => 'next',
)
Run Code Online (Sandbox Code Playgroud)

请注意,在拼接之前,$ var2是一个字符串,就像您预期的那样('next').但是,在拼接之后,$ var2已经被包含一个元素的数组替换,字符串'next'.

我认为导致它的原因是文档说:"如果替换不是数组,它将被一个类型(即(数组)$参数)强制转换." 所以发生的事情是这样的:

  • 您将$ var2传递给数组作为替换.
  • 在内部,php正在将$ var2转换为数组(&$ var2).它实际上可能正在做一些等同于$ param = array($ param)的东西,这意味着&$ var2将被设置为数组(&$ var2),因为它是一个引用而不是像通常那样的$ var2的副本会是,这会影响通常超出通话范围的变量.
  • 现在它将$ var2的新值移动到结束位置,并在第二个位置插入$ var2的副本.

我不确定内部发生的所有内容,但是$ var肯定会在拼接过程中被重新分配.请注意,如果您使用第三个变量,因为它不会将某些内容分配给已作为引用存在的内容,它会按预期工作:

<?php
  $hi = "test";
  $var2 = "next";
  $var3 = "last";
  $arr = array(&$hi);
  $arr[] = &$var2; // this works
  array_splice($arr, 1, 0, &$var3);
  printf("=== arr is now\n%s\n", var_export($arr, TRUE));
?>
Run Code Online (Sandbox Code Playgroud)

生成结果:

=== arr is now
array (
  0 => 'test',
  1 => 'last',
  2 => 'next',
)
Run Code Online (Sandbox Code Playgroud)