理解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中文網其他相關文章!