2017-08-31 2 views
2
<?php 

$arr = array(1); 
$a =& $arr[0]; 
$arr2 = $arr; 
$arr2[0]++; 

var_dump($arr); 

Cette partie du code produit 2. Pourquoi?PHP Référence élément de tableau modifié sans toucher

Nous avons seulement touché le premier élément de arr2 qui n'est pas attribué par référence à $arr. Ne alias pas au même tableau, alors pourquoi est-ce?

+0

Parce que $ arr2 est incrémenté de 1 à la fin, et il est assigné ce qui était $ arr. Je suggère print_r ($ arr) et j'y pense. Pas exactement sûr de ce que vous essayez d'accomplir dans ce cas bien que ce soit – clearshot66

Répondre

2

Lorsque vous affectez un tableau au suivant, une copie est effectuée. Mais parce que l'élément à $arr[0] est une référence plutôt qu'une valeur, une copie de la référence est faite, de sorte qu'à la fin, $arr[0] et $arr2[0] se réfèrent à la même chose.

Cela concerne plus les références que les tableaux. Les valeurs référencées ne sont pas copiées. Cela s'applique également aux objets. Tenir compte:

$ageRef = 7; 

$mike = new stdClass(); 
$mike->age = &$ageRef; // create a reference 
$mike->fruit = 'apple'; 

$john = clone $mike; // clone, so $mike and $john are distinct objects 
$john->age = 17; // the reference will survive the cloning! This will change $mike 
$john->fruit = 'orange'; // only $john is affected, since it's a distinct object 

echo $mike->age . " | " . $mike->fruit; // 17 | apple 

Voir la première note de l'utilisateur sur this documentation page et aussi this one.

+0

Ceci est étrange. Il ne semble pas que créer une référence à '$ arr [0]' devrait aussi transformer '$ arr [0]' en référence. Je suis surpris que je n'ai pas accidentellement traversé ça maintenant. –