【问题标题】:Array reference confusion in PHPPHP中的数组引用混淆
【发布时间】:2012-09-06 09:41:51
【问题描述】:
$arr = array(1);
$a = & $arr[0];

$arr2 = $arr;
$arr2[0]++;

echo $arr[0],$arr2[0];

// Output 2,2

你能帮我看看怎么可能吗?

【问题讨论】:

  • 您希望我们解释它是如何工作的?
  • 他只在 arr2 上递增,想知道为什么 arr 也是递增
  • 他的意思是这种行为很特殊,因为他将 $a 设置为对 $arr 的引用,但从不使用 $a。这确实很奇怪。
  • 不清楚是发生了什么还是他想要什么
  • @Robinv.G.注释中写的输出不正确。不可能。也许他使用的那个版本的 php 有一个错误。

标签: php


【解决方案1】:

但是请注意,数组内部的引用可能是 危险的。使用 右侧的参考不会将左侧变成 引用,但数组内的引用保留在这些正常的 作业。这也适用于数组所在的函数调用 按值传递。

/* Assignment of array variables */
$arr = array(1);
$a =& $arr[0]; //$a and $arr[0] are in the same reference set
$arr2 = $arr; //not an assignment-by-reference!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* The contents of $arr are changed even though it's not a reference! */

【讨论】:

  • @DaveRandom 请缩写 RTFM FTW。恐怕我走错路了;)
  • @SoumyaBiswas 是的,那么手册中的哪一部分混淆了?
  • @Bhuvan Rikka RTFM FTW - 阅读完整手册以获得胜利
  • @xdazz 赋值混淆。$arr2 = $arr 不是参考。那为什么要增加$arr[0]值。
  • @SoumyaBiswas 因为如果数组包含引用,那么数组内部的引用会保留在这些正常的赋值中。
【解决方案2】:
$arr = array(1);//creates an Array ( [0] => 1 ) and assigns it to $arr
$a = & $arr[0];//assigns by reference $arr[0] to $a and thus $a is a reference of $arr[0]. 
//Here $arr[0] is also replaced with the reference to the actual value i.e. 1

$arr2 = $arr;//assigns $arr to $arr2

$arr2[0]++;//increments the referenced value by one

echo $arr[0],$arr2[0];//As both $aar[0] and $arr2[0] are referencing the same block of memory so both echo 2

// Output 22

【讨论】:

    【解决方案3】:

    看起来 $arr[0] 和 $arr2[0] 指向同一个分配的内存,所以如果你在其中一个指针上递增,int 将在内存中递增

    链接Are there pointers in php?

    【讨论】:

    • 问题是为什么它指向同一个分配的内存。
    • 我还没读过,但是,$arr2 = $arr;似乎不是复制 $arr 而只是像在 C 中那样创建一个新指针
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多