2010-11-02 57 views
1

PHP,5.3非线程安全窗口,也在Linux上的PHP 5.2.9上得到验证。PHP引用,奇怪的现象,有人能解释一下吗?

示例代码:

$test1 = array(
      array("val"=>"a"), 
      array("val"=>"b"), 
      array("val"=>"c") 
     ); 


foreach($test1 as $key => $test) 
{ 
    echo $test['val'] . "\n"; 
} 
foreach($test1 as $key => &$test) 
{ 
    echo $test['val'] . "\n"; 
} 
foreach($test1 as $key => $test) 
{ 
    echo $test['val'] . "\n"; 
} 

输出:

a 
b 
c 
a 
b 
c 
a 
b 
b 

预期输出:

a 
b 
c 
a 
b 
c 
a 
b 
c 

所以会发生什么?我的第一个想法是,数组指针不知何故参与......它不是reset什么都没做。然后我认为参考是以某种方式更改值,但不是,如果我再次使用&test而不是最后一个运行预期输出,但是,在使用参考的第一个循环之后,任何没有引用的循环都会更改最后一个价值......这让我彻底难倒了。任何人都可以给我一个解释吗?

+1

没错。 '$ test'变量将在循环的范围之外,并且将在第二个循环之后成为一个引用。第三个循环将*赋值给该引用,覆盖这些值。 – 2010-11-02 13:47:33

回答

4

如果通过引用循环,则取消设置($ test),否则引用仍然存在。

foreach($test1 as $key => &$test) 
{ 
    echo $test['val'] . "\n"; 
} 
unset($test); 

此行为是well documented

警告 参考$ value并且最后一个数组元素的甚至foreach循环后依然存在。建议通过unset()销毁它。

+0

呃,确实检查了文档,但完全错过了它。 – 2010-11-02 13:56:59

相关问题