賦值行為如何影響 PHP 中的物件:值與引用?

Barbara Streisand
發布: 2024-10-22 07:25:30
原創
551 人瀏覽過

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

理解PHP 中的物件賦值:值與引用

說到PHP 中的物件賦值,理解值與引用之間的區別行為至關重要。 PHP 可以透過值或引用來指派物件。

原始程式碼片段

考慮以下PHP 程式碼:

<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>
登入後複製

問題:賦值行為

問題:賦值行為

當執行Bar::test()方法並更改foo物件數組中foo#5的值時,數組中實際的foo#5是否會受到影響,或者$testFoo 變數只是一個局部變量,在函數結束時不再存在?

答案:透過引用賦值

<code class="php">$b = new Bar;
echo $b->getFoo(5)->value;
$b->test();
echo $b->getFoo(5)->value;</code>
登入後複製

來決定行為,讓我們分析給定的程式碼:

Foo #5
My value has now changed
登入後複製

執行此程式碼會產生以下輸出:

說明

PHP 透過以下方式分配物件在版本5 中預設引用。這表示當 getFoo() 傳回 foo # 5 物件時,對相同物件的參考將儲存在 $testFoo 變數中。

因此,當 setValue()在 $testFoo 上呼叫方法,數組中實際的 foo #5 物件被修改,而不僅僅是本地副本。這就是為什麼 foo # 5 的值即使在 Bar::test() 方法執行後也會改變的原因。

按值賦值的注意事項

<code class="php">$testFoo = clone $this->getFoo(5);
$testFoo->setValue("My value has now changed");</code>
登入後複製
如果需要,您可以使用克隆關鍵字按值而不是按引用分配物件:

以上是賦值行為如何影響 PHP 中的物件:值與引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!