Bagaimana antara muka PHP sebenarnya mengubah tingkah laku kelas
P粉289775043
2023-09-02 23:49:28
<p>Menurut dokumentasi PHP, </p>
<blockquote>
<p>Antara muka objek membolehkan anda mencipta kod yang menentukan kaedah yang mesti dilaksanakan oleh kelas tanpa menentukan cara kaedah tersebut dilaksanakan. </p>
</blockquote>
<p>Oleh itu, antara muka adalah seperti kelas dengan kaedah pratakrif yang masih perlu diakses menggunakan <kod>-></code>
<p>Walau bagaimanapun, antara muka ArrayAccess menyediakan akses kepada objek sebagai tatasusunan. Objek boleh diakses menggunakan <kod>$object->property</code> dan <code>$object["property"]</code></p>
<p>Saya tidak dapat memahami bagaimana ArrayAccess memungkinkan untuk menukar sintaks objek. Saya menulis sekeping kod untuk cuba meniru kesan kaedah <kod>ArrayAccess</code>hanya satu</em>, tetapi ia menimbulkan ralat</p>
<pre class="brush:php;toolbar:false;">// 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
}
</pra>
<p>Tolong bantu saya menerangkannya dengan betul. Terima kasih</p>
Saya tidak mengatakan bahawa antara muka "mengubah tingkah laku kelas", saya mengatakan bahawa antara muka memudahkan untuk melanjutkan kefungsian 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 ialah kontrak. Begini cara untuk melaksanakan penaipan itik dalam 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 gunakan taip pengisytiharan untuk 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, PHP tidak 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?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 perpustakaanArrayAccess
Antara muka ArrayAccess
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 menyediakan sintaktik gula untuk kelas yang melaksanakan ArrayAccess. Ini bermakna anda boleh menggunakan kod yang lebih ringkas apabila 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: