2010-11-02 8 views
1

PHP, 5.3 fenêtre non-thread sûre, également prouvé sur PHP 5.2.9 sur Linux.Références PHP, phénomène étrange, quelqu'un peut-il expliquer?

Exemple de code:

$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"; 
} 

sortie:

a 
b 
c 
a 
b 
c 
a 
b 
b 

Sortie prévue:

a 
b 
c 
a 
b 
c 
a 
b 
c 

Alors qu'est-ce qui se passe? Ma première pensée était que le pointeur de tableau était en quelque sorte impliqué ... ce n'était pas reset n'a rien fait. Ensuite, je pensais que la référence était en quelque sorte en train de changer les valeurs, mais non, si je la lance avec &test encore au lieu du dernier la sortie attendue émerge, cependant, après la première boucle utilisant la référence, toute boucle SANS la référence changera la dernière valeur .... cela me laisse complètement perplexe. Quelqu'un peut-il me donner une explication?

+1

Exactement. La variable '$ test' restera en dehors de la portée de la boucle et sera une référence après la deuxième boucle. La troisième boucle assignera ensuite * à cette référence, en écrasant les valeurs. –

Répondre

4

Si vous faites une boucle par référence, annulez ($ test) sinon la référence existe toujours.

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

Ce comportement est well documented

Avertissement référence d'une valeur de $ et le dernier élément du tableau reste même après la boucle foreach. Il est recommandé de le détruire par unset().

+0

Ugh, a effectivement vérifié la documentation, mais l'a complètement raté. –