PHP Foreach Pass by Reference : le mystère de la duplication du dernier élément dévoilé
Considérez le code PHP suivant :
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) { /* do nothing by reference */ } print_r($arr); foreach ($arr as $item) { /* do nothing by value */ } print_r($arr);
Lors de l'exécution, il modifie de manière inattendue le tableau d'origine $arr, ce qui entraîne le résultat suivant sortie :
Array ( [0] => foo [1] => bar [2] => baz ) Array ( [0] => foo [1] => bar [2] => bar )
Comprendre le comportement
Après la boucle foreach initiale, la variable $item reste une référence au même emplacement mémoire que $arr[2] . Par conséquent, chaque itération de la deuxième boucle foreach, qui transmet les arguments par valeur, remplace la valeur référencée (et donc $arr[2]) par la valeur de la nouvelle itération.
Explication détaillée
Dans la première boucle :
A la fin de la première boucle, $item pointe toujours vers $arr[2].
Dans la seconde loop:
Clarifier les idées fausses
Ce comportement n'est pas considéré comme un bug. Cela correspond au comportement prévu des références en PHP. Des résultats similaires seraient observés si vous utilisiez la syntaxe suivante en dehors d'une boucle :
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
Conclusion
Lorsque vous travaillez avec des références en PHP, il est crucial de reconnaître que les modifications apportées via la variable référencée affecteront également la valeur d'origine. Ce comportement peut être exploité efficacement ou évité en fonction du résultat souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!