考虑这个 PHP 代码片段,它按值引用在数组中循环:

$arr = [1 ,2 , 3];
var_dump($arr);
echo '<br>';

foreach ($arr as &$val) { // note ampersand sign
   // Anything
}

var_dump($arr);

现在第一个 var_dump() 发出



但是第二个发出



因此,通过引用在数组中循环已经改变了最后一个值类型——从整数到整数 引用 !
怎么可能呢?为什么 PHP 决定自己更改元素类型,而开发人员并不打算这样做?

最佳答案

要理解这种行为,您需要了解一些关于 PHP 的事情:

  • PHP 中的引用是对称的:您不是“创建对变量的引用”,而是“将变量添加到引用集”。
  • 一个 foreach 引用与一系列引用赋值相同,一个接一个。
  • 数组值本身就被视为变量,并且可以具有所有相同的类型信息,包括作为引用集的一部分。

  • 所以让我们“展开”你的循环:
    // create a reference set containing $val and $arr[0]
    $val =& $arr[0];
    // remove $val from the first reference set,
    // and create a second reference set containing $val and $arr[1]
    $val =& $arr[1];
    // remove $val from the second reference set,
    // and create a third reference set containing $val and $arr[2]
    $val =& $arr[2];
    

    此时,$arr[0]$arr[1] 都在一个大小为 1 的引用集中,因此可以看作是“正常值”。但是, $arr[2] 仍然在与 $val 的引用集中。

    这意味着对 $arr[2] 的任何更改都将反射(reflect)在 $val 中,而 $val 中的任何更改都将反射(reflect)在 $arr[2] 中。这就是为什么 var_dump& 注释该项目,以表明更改它也会更改其他地方的另一个变量。

    这就是为什么在使用 foreach-by-reference 之后总是运行 unset($val); 是一个好习惯的原因。

    关于php - 在数组中循环更改元素类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57870508/

    10-12 00:48
    查看更多