Comment le comportement d'affectation affecte-t-il les objets en PHP : valeur par rapport à la référence ?

Barbara Streisand
Libérer: 2024-10-22 07:25:30
original
553 Les gens l'ont consulté

How Does Assignment Behavior Affect Objects in PHP: Value vs. Reference?

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

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

L'exécution de ce code produit le résultat suivant :

Foo #5
My value has now changed
Copier après la connexion

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>
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
Derniers articles par auteur
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!