PHP使用相同的var后通过引用错误传递

时间:2012-11-30 18:22:19

标签: php reference

看看这段代码,并帮助我理解结果

$x = array('hello', 'beautiful', 'world');
$y = array('bye bye','world', 'harsh');

foreach ($x as $n => &$v) { }

$v = "DONT CHANGE!";

foreach ($y as $n => $v){ }

print_r($x);
die;

打印:

Array
(
    [0] => hello
    [1] => beautiful
    [2] => harsh
)

为什么它会改变$ x的最后一个元素?它只是不遵循任何逻辑!

3 个答案:

答案 0 :(得分:4)

// ...
$v = "DONT CHANGE!";
unset($v);
// ...

因为$v仍然是引用,后来占用了最后一个foreach循环中的最后一项。

编辑:请参阅the reference所在位置(在代码块中)

  

unset($value); // break the reference with the last element

答案 1 :(得分:4)

执行此循环后:

foreach ($x as $n => &$v) { }

$v最终作为对$x[2]的引用。您分配给$v的任何内容实际上都会被分配$x[2]。所以在第二个循环的每次迭代中:

foreach ($y as $n => $v) { }

$v(或者我应该说$x[2])成为:

  • 'bye bye'
  • 'world'
  • 'harsh'

答案 2 :(得分:0)

Foreach循环不是函数。在foreach中的&符号(&)不能保存像函数那样的值。 因此,即使你在第二个foreach()中有$ var,也不要指望它像循环中的“幽灵”。