En PHP, les tableaux sont assignés par copie, alors que les objets sont assignés par référence. Cela signifie que :
$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);
Cédera :
array(0) {
}
Considérant que :
$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);
Rendement :
object(stdClass)#1 (1) {
["foo"]=>
int(42)
}
Vous pourriez être dérouté par des subtilités telles que ArrayObject
qui est un objet qui se comporte exactement comme un tableau. Cependant, étant un objet, il possède une sémantique de référence.
Editer : @AndrewLarsson soulève un point dans les commentaires ci-dessous. PHP possède une fonctionnalité spéciale appelée "références". Elles sont un peu similaires aux pointeurs des langages comme C/C++, mais pas tout à fait les mêmes. Si votre tableau contient des références, alors que le tableau lui-même est passé par copie, les références seront toujours résolues vers la cible originale. Bien sûr, c'est généralement le comportement souhaité, mais j'ai pensé que cela valait la peine d'être mentionné.
0 votes
Vraiment en retard, mais dans mon environnement j'ai testé ceci (et ça a marché) : function arrayCopy(array $a) { return $a ; } $a1 = array() ; for ($i=0 ; $i<3 ; $i++) { $a1["key-$i"] = "value #$i" ; } $a1["key-sub-array"] = array(1, 2, 3, 4) ; $a2 = $a1 ; $a3 = arrayCopy($a1) ; for ($i=0 ; $i<3 ; $i++) { if ( ! is_array($a2["key-$i"])) { $a2["key-$i"] = "valeur modifiée #$i" ; } } $a2["key-sub-array"] = array("changed sub-array 1", "changed sub-array 2") ; var_dump($a1) ; var_dump($a2) ; var_dump($a3) ; L'astuce consiste à ne pas passer le tableau comme référence dans la fonction ;-)
1 votes
@Sven, y a-t-il une raison pour laquelle il s'agit d'un commentaire plutôt que d'une réponse ? Je n'arrive pas à comprendre.