Maison  >  Article  >  développement back-end  >  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 ?

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 ?

DDD
DDDoriginal
2024-10-22 07:22:30358parcourir

When Changing the Value of Object Variables, How Does PHP Handle Assignment of Reference and Value?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn