Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah Gelagat Tugasan Mempengaruhi Objek dalam PHP: Nilai vs. Rujukan?
Memahami Penetapan Objek dalam PHP: Nilai vs. Rujukan
Apabila ia datang kepada penetapan objek dalam PHP, fahami perbezaan antara nilai dan rujukan tingkah laku adalah penting. PHP boleh menetapkan objek sama ada mengikut nilai atau rujukan.
Coretan Kod Asal
Pertimbangkan kod PHP berikut:
<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>
Soalan: Kelakuan Tugasan
Apabila kaedah Bar::test() dilaksanakan dan menukar nilai foo # 5 dalam tatasusunan objek foo, adakah foo # 5 sebenar dalam tatasusunan akan terjejas , atau adakah pembolehubah $testFoo hanya pembolehubah tempatan yang tidak lagi wujud pada penghujung fungsi?
Jawapan: Tugasan melalui Rujukan
Untuk menentukan tingkah laku , mari kita analisa kod yang diberikan:
<code class="php">$b = new Bar; echo $b->getFoo(5)->value; $b->test(); echo $b->getFoo(5)->value;</code>
Melaksanakan kod ini menghasilkan output berikut:
Foo #5 My value has now changed
Penjelasan
PHP memperuntukkan objek dengan rujukan secara lalai dalam versi 5. Ini bermakna apabila objek foo # 5 dikembalikan oleh getFoo(), rujukan kepada objek yang sama disimpan dalam pembolehubah $testFoo.
Oleh itu, apabila setValue() kaedah dipanggil pada $testFoo, objek foo # 5 sebenar dalam tatasusunan diubah suai, bukan hanya salinan tempatan. Inilah sebab mengapa nilai foo # 5 berubah walaupun selepas kaedah Bar::test() dilaksanakan.
Nota tentang Tugasan Mengikut Nilai
Jika mahu, anda boleh menetapkan objek mengikut nilai dan bukannya dengan rujukan menggunakan kata kunci klon:
<code class="php">$testFoo = clone $this->getFoo(5); $testFoo->setValue("My value has now changed");</code>
Atas ialah kandungan terperinci Bagaimanakah Gelagat Tugasan Mempengaruhi Objek dalam PHP: Nilai vs. Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!