ホームページ >バックエンド開発 >PHPチュートリアル >オブジェクト変数の値を変更する場合、PHP は参照と値の割り当てをどのように処理しますか?

オブジェクト変数の値を変更する場合、PHP は参照と値の割り当てをどのように処理しますか?

DDD
DDDオリジナル
2024-10-22 07:22:30439ブラウズ

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

PHP での代入: 値または参照による受け渡し

PHP のオブジェクトは、代入に関してはプリミティブ データ型とは異なる方法で処理されます。デフォルトでは、PHP は参照によって変数を割り当てます。つまり、オブジェクトの変数の値を変更すると、元のオブジェクトにも影響します。この動作は、特にオブジェクトの配列を操作する場合にやや混乱する可能性があります。

コードの説明

次のコード スニペットを考えてみましょう。

<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>

値渡しと参照渡し

ここで、コードを分析して質問に答えましょう:

メソッド Bar::test() が実行され、 foo オブジェクトの配列内の foo #5 の値、配列内の実際の foo #5 は影響を受けますか?

getFoo メソッドがインデックス 5 の Foo オブジェクトを返すとき、次の方法でオブジェクトのコピーを返します。 PHP はデフォルトでプリミティブ データ型の値によって変数を割り当て、参照データ型のコピーを割り当てるためです。したがって、$testFoo オブジェクトに加えられた変更は、配列に再び割り当てられるまで、配列内の元のオブジェクトには影響しません。

参照による代入

ただし、テスト内のコードは、返された Foo オブジェクトを直接変更します。オブジェクトへの割り当てが行われるとき、PHP は参照によって割り当てます。これは、割り当てられたオブジェクトに加えられた変更が元のオブジェクトに反映されることを意味します。その結果、$testFoo で setValue メソッドが呼び出された後、$foos 配列のインデックス 5 にある元の Foo オブジェクトが更新されます。

デモ

コードは次の出力を生成します:

Foo #5
My value has now changed

この出力は、参照による代入動作が配列内の元のオブジェクトに影響を与えていることを示しています。

代入動作の変更

参照ではなく値によってオブジェクトを割り当てる (コピーを作成する) 場合は、以下に示すように 'clone' キーワードを使用できます。

<code class="php">$testFoo = clone $this->getFoo(5);</code>

以上がオブジェクト変数の値を変更する場合、PHP は参照と値の割り当てをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。