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
Libérer: 2024-10-22 07:22:30
original
356 Les gens l'ont consulté

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>
Copier après la connexion

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
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!