Attention aux références dans un tableau !

Il y a un comportement particulier dans la gestion des références sur des éléments de tableaux (Toutes versions de PHP) .

Voici un exemple:

  1. <?php
  2. $a = array(3,7);
  3. $b = $a;
  4. $b[1] = 11;
  5. print_r($a);
  6. print_r($b);
  7. ?>

Ce qui retourne évidemment :

Array
(
 [0] => 3
 [1] => 7
)
Array
(
 [0] => 3
 [1] => 11
)

Maintenant, j’ajoute une ligne qui ne semble pas perturber :

  1. <?php
  2. $a = array(3,7);
  3. $x = &$a[1];
  4. $b = $a;
  5. $b[1] = 11;
  6. print_r($a);
  7. print_r($b);
  8. ?>

Voyez la ligne 3 ?
Le résultat devrait être le même qu’avant, non ? Et pourtant :

Array
(
 [0] => 3
 [1] => 11
)
Array
(
 [0] => 3
 [1] => 11
)

En fait, ce n’est pas un bug, mais un comportement lié à la gestion des références dans les tableaux. Quand on copie un tableau, on copie également les références qui ont été posées sur les clefs.

Vous aimerez aussi...

5 réponses

  1. dam75 dit :

    Euhhhh je veux bien que ce soit voulu, mais c’est incompréhensible, illogique et source de pleins d’erreurs … en quoi le fait de créer une réf sur un tableau affecte les copies ? et il se serait passé quoi si tu avais fait la copie avant de faire la référence ?
    Tu sais pourquoi ils ont « voulu » faire ça ?

    Pfff …

  2. Frédéric dit :

    En effet, si tu fais la copie après, tu n’as pas le problème.
    C’est un comportement (bug ?) connu, lié à l’optimisation de la copie. C’est même dans la doc : http://php.net/manual/en/language.references.whatdo.php

    En fait, la copie d’un tableau se fait élément par élément. Du coup, le tableau « $b » se voit récupérer l’information sur laquelle le 2ième élément est une référence, et donc … il la copie avec.

    Apparemment, HHVM n’a pas cette « anomalie ».

  3. Xavier dit :

    Vérifié aussi sur PHP 5.5.13… Effectivement hyper dangereux… C’est un bon exemple « d’optimisation » dangereuse je trouve, il ne faut peut-être pas tout sacrifier sur l’hôtel de la performance…

  4. Frédéric dit :

    De toutes façons, les références, c’est mal ….

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *