Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bilakah kaedah sihir `__get` dan `__set` PHP sebenarnya digunakan?

Bilakah kaedah sihir `__get` dan `__set` PHP sebenarnya digunakan?

Patricia Arquette
Patricia Arquetteasal
2024-11-15 12:53:02275semak imbas

When are PHP's `__get` and `__set` magic methods actually invoked?

Kaedah Sihir PHP: Membongkar __get dan __set untuk Lebihan Harta

Dalam PHP, kaedah sihir __get dan __set menyediakan cara alternatif untuk mengendalikan akses dan pengubahsuaian harta di luar pengambil dan penetap tradisional. Kaedah ini membolehkan pembangun memintas dan menyesuaikan gelagat akses harta apabila harta yang diminta tidak ditakrifkan secara eksplisit.

Walau bagaimanapun, salah tanggapan yang biasa ialah kaedah __get dan __set digunakan untuk melebihkan kata kunci dapatkan dan tetapkan. Ini tidak sepenuhnya tepat.

Kaedah Lebih Muatan Harta dan Ajaib

Walaupun kaedah __get dan __set boleh digunakan untuk satu bentuk lebihan harta, ia berbeza daripada lebihan biasa. kaedah dalam bahasa lain. PHP secara eksplisit mengendalikan akses harta melalui pengisytiharan harta awam, dilindungi dan persendirian. Jika sifat tidak diisytiharkan dalam skop tertentu, PHP akan menjana ralat.

Kaedah ajaib mula dimainkan apabila PHP cuba mengakses sifat yang tidak diisytiharkan secara eksplisit. Dalam kes ini, kaedah __get dan __set menawarkan cara untuk mengendalikan akses harta secara dinamik.

Menggunakan __get dan __set

Untuk menggambarkan penggunaan kaedah __get dan __set, pertimbangkan contoh berikut:

class foo {
    public $bar;  // Public property
    public function __get($name) {
        echo "Get:$name";
        return $this->$name;  // Custom behavior for accessing inaccessible properties
    }
    public function __set($name, $value) {
        echo "Set:$name to $value";
        $this->$name = $value;  // Custom behavior for setting inaccessible properties
    }
}

Dalam senario ini, __get dan Kaedah __set direka untuk menyediakan tingkah laku tersuai apabila mengakses atau mengubah suai sifat $bar. Contohnya, memanggil echo $foo->bar; akan mencetuskan kaedah __get, manakala $foo->bar = 'test'; akan melibatkan kaedah __set.

Penyahpepijatan dan Perangkap Biasa

Walau bagaimanapun, seperti yang diterangkan dalam soalan asal, jika harta itu sudah diisytiharkan secara terbuka (seperti dalam contoh ini) , masa jalan PHP akan terus mengakses harta itu. Oleh itu, kaedah __get dan __set tidak akan digunakan.

Tingkah laku ini disahkan dalam bahagian manual PHP tentang Pemuatan Lebih Harta, yang menyatakan bahawa kaedah __set dan __get hanya dipanggil semasa menulis atau membaca data kepada sifat yang tidak boleh diakses, bukan harta awam.

Secara amnya, kaedah sihir tidak boleh dilihat sebagai pengganti untuk fungsi getter dan setter yang betul atau panggilan kaedah langsung. Mereka terutamanya memenuhi tujuan mengendalikan akses harta yang tidak sah dan menyediakan gelagat alternatif dalam senario sedemikian. Selain itu, adalah penting untuk ambil perhatian bahawa kaedah ajaib boleh mengakibatkan penalti prestasi berbanding dengan akses harta langsung.

Untuk menangani isu yang dihadapi dalam soalan asal, kaedah pengambil dan penetap eksplisit boleh ditakrifkan, yang akan mengendalikan secara langsung akses dan pengubahsuaian hartanah. Pendekatan ini lebih cekap dan memberikan kawalan yang lebih besar ke atas semantik akses harta benda.

Atas ialah kandungan terperinci Bilakah kaedah sihir `__get` dan `__set` PHP sebenarnya digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn