Maison >développement back-end >tutoriel php >Comment le comportement d'affectation affecte-t-il les objets en PHP : valeur par rapport à la référence ?
Comprendre l'affectation d'objets en PHP : valeur par rapport à la référence
Quand il s'agit d'affectation d'objets en PHP, comprendre la différence entre valeur et référence le comportement est crucial. PHP peut attribuer des objets par valeur ou par référence.
Extrait de code original
Considérez le code PHP suivant :
<code class="php">class Foo { var $value; function foo($value) { $this->setValue($value); } function setValue($value) { $this->value = $value; } } class Bar { var $foos = array(); function Bar() { for ($x = 1; $x <= 10; $x++) { $this->foos[$x] = new Foo("Foo # $x"); } } function getFoo($index) { return $this->foos[$index]; } function test() { $testFoo = $this->getFoo(5); $testFoo->setValue("My value has now changed"); } }</code>
Question : Comportement d'affectation
Lorsque la méthode Bar::test() est exécutée et modifie la valeur de foo # 5 dans le tableau d'objets foo, le foo # 5 réel dans le tableau sera-t-il affecté , ou la variable $testFoo ne sera-t-elle qu'une variable locale qui cesse d'exister à la fin de la fonction ?
Réponse : Assignation par référence
Pour déterminer le comportement , analysons le code donné :
<code class="php">$b = new Bar; echo $b->getFoo(5)->value; $b->test(); echo $b->getFoo(5)->value;</code>
L'exécution de ce code produit le résultat suivant :
Foo #5 My value has now changed
Explication
PHP attribue les objets par référence par défaut dans la version 5. Cela signifie que lorsque l'objet foo # 5 est renvoyé par getFoo(), une référence au même objet est stockée dans la variable $testFoo.
Par conséquent, lorsque la fonction setValue() est appelée sur $testFoo, l'objet foo # 5 réel dans le tableau est modifié, pas seulement une copie locale. C'est la raison pour laquelle la valeur de foo # 5 change même après l'exécution de la méthode Bar::test().
Remarque sur l'affectation par valeur
Si vous le souhaitez, vous pouvez attribuer des objets par valeur plutôt que par référence en utilisant le mot-clé clone :
<code class="php">$testFoo = clone $this->getFoo(5); $testFoo->setValue("My value has now changed");</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!