Tugasan dalam PHP: Melewati Nilai atau Rujukan
Objek dalam PHP dikendalikan secara berbeza daripada jenis data primitif apabila berkaitan dengan tugasan. Secara lalai, PHP memberikan pembolehubah melalui rujukan, bermakna mengubah nilai pembolehubah objek juga akan mempengaruhi objek asal. Tingkah laku ini boleh menjadi agak mengelirukan, terutamanya apabila bekerja dengan tatasusunan objek.
Penjelasan Kod
Pertimbangkan coretan kod berikut:
<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>
Melalui Nilai dan Rujukan
Sekarang, mari analisa kod dan jawab soalan:
Apabila kaedah Bar::test() dijalankan dan ia mengubah nilai foo #5 dalam tatasusunan objek foo, adakah foo #5 sebenar dalam tatasusunan akan terjejas?
Apabila kaedah getFoo mengembalikan objek Foo pada indeks 5, ia mengembalikan salinan objek dengan lalai kerana PHP memberikan pembolehubah mengikut nilai untuk jenis data primitif dan salinan untuk jenis data rujukan secara lalai. Oleh itu, perubahan yang dibuat pada objek $testFoo tidak akan menjejaskan objek asal dalam tatasusunan sehingga ia ditugaskan kembali kepada tatasusunan.
Tugasan melalui Rujukan
Walau bagaimanapun , kod dalam ujian secara langsung mengubah suai objek Foo yang dikembalikan. Apabila tugasan kepada objek dibuat, PHP memberikan dengan rujukan. Ini bermakna perubahan yang dibuat pada objek yang ditetapkan akan ditunjukkan dalam objek asal. Akibatnya, selepas kaedah setValue dipanggil pada $testFoo, objek Foo asal pada indeks 5 dalam tatasusunan $foos dikemas kini.
Demonstrasi
Menjalankan kod akan menghasilkan output berikut:
Foo #5 My value has now changed
Output ini menunjukkan bahawa tugasan melalui gelagat rujukan telah menjejaskan objek asal dalam tatasusunan.
Menukar Gelagat Tugasan
Jika anda ingin menetapkan objek mengikut nilai (membuat salinan) dan bukannya dengan rujukan, anda boleh menggunakan kata kunci 'klon', seperti yang ditunjukkan di bawah:
<code class="php">$testFoo = clone $this->getFoo(5);</code>
Atas ialah kandungan terperinci Apabila Menukar Nilai Pembolehubah Objek, Bagaimanakah PHP Mengendalikan Penetapan Rujukan dan Nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!