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

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-22 07:25:30558parcourir

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>

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!

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