Menurut dokumentasi PHP,
Antara muka objek membolehkan anda mencipta kod yang menentukan kaedah yang mesti dilaksanakan oleh kelas tanpa menentukan cara kaedah tersebut dilaksanakan.
Oleh itu, antara muka adalah seperti kelas dengan kaedah pratakrif yang masih perlu diakses menggunakan Walau bagaimanapun, antara muka ArrayAccess menyediakan akses kepada objek sebagai tatasusunan. Objek boleh diakses menggunakan Saya tidak dapat memahami bagaimana ArrayAccess memungkinkan untuk menukar sintaks objek. Saya menulis sekeping kod untuk cuba meniru kesan kaedah Tolong bantu saya menerangkannya dengan betul. Terima kasih$object["property"]
// Menggunakan Antara Muka PHP ArrayAccess ruang nama A { kelas myclass melaksanakan ArrayAccess { public function offsetExists($offset) { return true } fungsi awam offsetGet($offset) { // berubah tingkah laku kembalikan $this->{$offset} ?? } fungsi awam offsetSet($offset, $value) {} fungsi awam offsetUnset($offset) {} } $myclass = new myclass(); $myclass->access = 'Antaramuka'; echo $myclass['access']; // "Antaramuka" }; //Cuba untuk melaksanakan Antara Muka ArrayAccess saya sendiri ruang nama B { antara muka MyArrayAccess { fungsi awam offsetGet($offset); } kelas myclass melaksanakan MyArrayAccess { fungsi awam offsetGet($offset) { // ubah tingkah laku kembalikan $this->{$offset} ?? } } $myclass = new myclass(); $myclass->access = 'Antaramuka'; echo $myclass['access']; // Ralat maut: Ralat Tidak Ditangkap: Tidak boleh menggunakan objek jenis Bmyclass sebagai tatasusunan }
Saya tidak mengatakan bahawa antara muka "mengubah tingkah laku kelas", saya mengatakan bahawa antara muka memudahkan untukmelanjutkankefungsian kelas.
Untuk memahami antara muka, sebagai konsep pengaturcaraan berorientasikan objek, kita harus terlebih dahulu memahami masalah yang ingin diselesaikan.
Apakah masalah yang ingin diselesaikan oleh "Antara Muka"?
Antara muka ialahkontrak. Begini cara untuk melaksanakanpenaipan itikdalam PHP. Anda perlu berfikir dari perspektif penulis perpustakaan yang ingin mendedahkan fungsi kepada orang lain. Contohnya,
Untuk memastikan pengguna perpustakaan mengetahui kaedah
$person
需要有getName()
方法,您可以创建一个类Person
> 有一个getName()
. Kemudian gunakantaip pengisytiharanuntuk mengesan kemungkinan ralat apabila kod diselesaikan.Andaikan ada perpustakaan lain yang menyuap sesuatu dengan makanan:
Pertimbangkan ini...
Sekarang, katakan pengguna ingin menulis fungsi yang boleh makan dan bertanya khabar
Pet
类。用户不想仅仅为了Pet
Tulis semula fungsi ini.Bagaimana menulis
Pet
以便同时使用Greeter
和Feeder
perpustakaan?Mungkin ini kesnya?
Malangnya, PHPtidak menyokong pelbagai warisan. Satu kelas hanya boleh mempunyai satu kelas. Kod di atas tidak sah. Jadi dalam keadaan semasa, pengguna hanya boleh menggunakan salah satu perpustakaan.
Selain itu, "nama" boleh menjadi konsep yang sangat berbeza untuk perkara yang berbeza (mis. seseorang mungkin menggunakan kaedah扩展
.
Jadi, sebagai penulis perpustakaan, anda mahu perpustakaannya sefleksibel mungkin untuk pengguna. apa yang kau boleh buat? Bagaimana untuk menyelesaikan masalah ini menggunakan "antara muka" dalam PHP? Antara muka ialah pengisytiharan tandatangan kaedah. Ini ialah cara cepat untuk mengisytiharkan keperluan perpustakaan tanpa keperluan kelas/warisan konkrit. Menggunakan antara muka anda boleh menulis semula kedua-dua perpustakaan seperti ini:getName() 返回
$first_name
和$last_name
代码>)。您的库类中可能没有合理的默认实现getName()
perpustakaan
Greeter
perpustakaan
Tidak memerlukan kelas tertentu (atau warisan kelas induk), kelas boleh melaksanakan berbilang antara muka. Jadi kelasFeeder
berikut sah sepenuhnya dalam PHP:
Kini, objek kelasPet
ini boleh digunakan dengan perpustakaan
.Pet
类的对象可以与Greeter
库和Feeder
dan perpustakaan
Bagaimana pula dengan antara muka?ArrayAccess
Antara mukaArrayAccess
tidak diisytiharkan oleh penulis perpustakaan antara muka pihak ketiga, tetapi ditulis oleh penulis teras PHP. Penulis PHP teras menyediakan sokongan yang lebih mendalam untuk ini.Agak seperti antara muka yang kami nyatakan sebelum ini, PHP menyediakan fungsi kepada kelas yang melaksanakannya. Tetapi bukannya menyediakan
Greeter
或Feeder
contoh di atas, teras PHP menyediakansintaktik gulauntuk kelas yang melaksanakan ArrayAccess. Ini bermakna anda boleh menggunakankod yang lebih ringkasapabila berurusan dengan kelas yang melaksanakan antara muka AccessAccess.Dalam contoh rasmi,
Jika anda melaksanakannya, gantikan dengan:
Anda boleh menggunakan
$obj
dengan sintaks seperti tatasusunan untuk menjadikan kod anda lebih pendek: