取消通过引用传递,也取消原始值

时间:2014-10-07 20:02:30

标签: php reference

我想要一个数组的引用,然后取消设置对数组的一些元素的引用。对于这个问题,我简化了代码:

echo"1:";
print_r($this->data);
$return =& $this->data;
foreach(range(1,10) AS $key)
{
    unset($return[$key]);
}
echo"2:";
print_r($this->data);

$ this-> data是一个数组。此代码应保持$ this->数据不变,但它不会。输出是:

1:Array
(
[0] => Array
    (
        [id] => 1
    )

[1] => Array
    (
        [id] => 2
    )

[2] => Array
    (
        [id] => 3
    )

[3] => Array
    (
        [id] => 4
    )

[4] => Array
    (
        [id] => 5
    )

[5] => Array
    (
        [id] => 6
    )

[6] => Array
    (
        [id] => 7
    )

[7] => Array
    (
        [id] => 8
    )

[8] => Array
    (
        [id] => 9
    )

[9] => Array
    (
        [id] => 10
    )

)
2:Array
(
[0] => Array
    (
        [id] => 1
    )

)

为什么通过取消设置引用,$ this->数据中的数组会被更改? stackoverflow关于删除引用的所有其他问题都使用unset()函数,那为什么会出现问题?

感谢。

2 个答案:

答案 0 :(得分:1)

通过使用$return =& $this->data创建引用,您基本上为数组$this->data提供了一个新名称。这是什么参考。现在,使用新名称或旧名称访问数组没有任何区别。

答案 1 :(得分:0)

不同之处在于您实际上并未取消参考。您正在取消引用数据中的值。请参阅此沙箱:PHP Unset Test

$a=1;
$b = & $a;

unset($a);
echo 'B'."\n";
echo $b;

echo "\n\n";

$c=array(0,1,2,3);
$d = & $c;

unset($c);

echo 'D'."\n";
var_export($d);

echo "\n\n";

$e=array(0,1,2,3);
$f = & $e;

unset($f[2]);
echo 'E'."\n";
var_export($e);

输出:

B
1

D
array (
  0 => 0,
  1 => 1,
  2 => 2,
  3 => 3,
)

E
array (
  0 => 0,
  1 => 1,
  3 => 3,
)