Maison >développement back-end >tutoriel php >Lors de la modification de la valeur des variables d'objet, comment PHP gère-t-il l'attribution de référence et de valeur ?
Affectation en PHP : passage par valeur ou référence
Les objets en PHP sont traités différemment des types de données primitifs en matière d'affectation. Par défaut, PHP attribue des variables par référence, ce qui signifie que changer la valeur d'une variable d'un objet affectera également l'objet d'origine. Ce comportement peut être quelque peu déroutant, en particulier lorsque vous travaillez avec des tableaux d'objets.
Explication du code
Considérez l'extrait de code suivant :
<code class="php">class Foo { // ... } class Bar { private array $foos; // ... public function getFoo(int $index): Foo { return $this->foos[$index]; } public function test(): void { $testFoo = $this->getFoo(5); $testFoo->setValue("My value has now changed"); } } $b = new Bar; echo $b->getFoo(5)->value; $b->test(); echo $b->getFoo(5)->value;</code>
Passage par valeur et par référence
Maintenant, analysons le code et répondons à la question :
Lorsque la méthode Bar::test() est exécutée et qu'elle modifie le valeur de foo #5 dans le tableau d'objets foo, le foo #5 réel dans le tableau sera-t-il affecté ?
Lorsque la méthode getFoo renvoie l'objet Foo à l'index 5, elle renvoie une copie de l'objet par par défaut puisque PHP attribue des variables par valeur pour les types de données primitifs et des copies pour les types de données de référence par défaut. Par conséquent, les modifications apportées à l'objet $testFoo n'affecteront pas l'objet d'origine dans le tableau jusqu'à ce qu'il soit réaffecté au tableau.
Affectation par référence
Cependant , le code à l'intérieur de test modifie directement l'objet Foo renvoyé. Lorsqu'une affectation à un objet est effectuée, PHP l'attribue par référence. Cela signifie que les modifications apportées à l'objet attribué seront reflétées dans l'objet d'origine. Par conséquent, une fois la méthode setValue appelée sur $testFoo, l'objet Foo d'origine à l'index 5 dans le tableau $foos est mis à jour.
Démonstration
Exécution de la Le code produira le résultat suivant :
Foo #5 My value has now changed
Ce résultat démontre que le comportement d'affectation par référence a affecté l'objet d'origine dans le tableau.
Modification du comportement d'affectation
Si vous souhaitez attribuer un objet par valeur (en créant une copie) plutôt que par référence, vous pouvez utiliser le mot-clé 'clone', comme indiqué ci-dessous :
<code class="php">$testFoo = clone $this->getFoo(5);</code>
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!