Apakah itu antara muka? Bagaimana untuk menggunakan antara muka dalam PHP? Artikel ini akan bercakap tentang menggunakan antara muka untuk menulis kod PHP yang lebih elegan. Saya harap ia akan membantu anda!
Dalam pengaturcaraan, adalah penting untuk memastikan bahawa kod itu boleh dibaca, boleh diselenggara, boleh dikembangkan dan mudah untuk diuji dan menggunakan antara muka adalah tepat bagaimana kami menambah baik semua faktor ini dalam kod Salah satu kaedah.
Artikel ini bertujuan untuk pembangun yang mempunyai pemahaman asas tentang konsep OOP (Pengaturcaraan Berorientasikan Objek) dan menggunakan warisan dalam PHP. Jika anda tahu cara menggunakan warisan dalam kod PHP, anda seharusnya mempunyai pemahaman yang baik tentang artikel ini.
Ringkasnya, antara muka hanyalah penerangan tentang perkara yang perlu dilakukan oleh kelas dan ia boleh digunakan untuk memastikan bahawa mana-mana kelas yang melaksanakan antara muka akan merangkumi setiap kaedah awam yang ditakrifkan di dalamnya.
Antaramuka boleh :
Antaramuka tidak boleh:
interface DownloadableReport { public function getName(): string; public function getHeaders(): array; public function getData(): array; }
kita boleh tahu bahawa antara muka mempunyai dua utama Tujuan:
, Iterable
, dsb. untuk menerangkan maksud antara muka ini sebenarnya. Cacheable
Renderable
class BlogReport { public function getName(): string { return 'Blog report'; } }
getName()
class ReportDownloadService { public function downloadPDF(BlogReport $report) { $name = $report->getName(); // 下载文件…… } }
kerana kami telah menguatkuasakan bahawa kaedah hanya boleh lulus UsersReport
kelas. Oleh itu, kita mesti mengubah suai nama kaedah muat turun asal (untuk mengelakkan nama pendua), dan kemudian menambah kaedah yang serupa, seperti yang ditunjukkan di bawah: ReportDownloadService
BlogReport
class ReportDownloadService { public function downloadBlogReportPDF(BlogReport $report) { $name = $report->getName(); // 下载文件…… } public function downloadUsersReportPDF(UsersReport $report) { $name = $report->getName(); // 下载文件…… } }
Sebagai contoh, katakan kita mencipta $name = $report->getName();
baharu; kita kini perlu menambah kaedah
AnalyticsReport
Mari mulakan dengan mencipta antara muka pertama kami: Mari namakannya downloadAnalyticsReportPDF()
dan takrifkannya seperti berikut:
DownloadableReport
Kini kami boleh mengemas kini
interface DownloadableReport { public function getName(): string; public function getHeaders(): array; public function getData(): array; }
antara muka seperti yang ditunjukkan dalam contoh di bawah. Tetapi sila ambil perhatian bahawa untuk tujuan demonstrasi, saya sengaja menulis kod dalam BlogReport
salah: UsersReport
DownloadableReport
UsersReport
class BlogReport implements DownloadableReport { public function getName(): string { return 'Blog report'; } public function getHeaders(): array { return ['The headers go here']; } public function getData(): array { return ['The data for the report is here.']; } }
缺少 getHeaders()
方法.
getName()
方法不包括接口的方法签名中定义的返回类型。
getData()
方法定义了一个返回类型,但它与接口的方法签名中定义的类型不同。
因此,为了修复 UsersReport
使其正确实现 DownloadableReport
接口,我们可以将其修改为:
class UsersReport implements DownloadableReport { public function getName(): string { return 'Users Report'; } public function getHeaders(): array { return []; } public function getData(): array { return ['The data for the report is here.']; } }
现在两个报告类都实现了相同的接口,我们可以这样更新我们的 ReportDownloadService
:
class ReportDownloadService { public function downloadReportPDF(DownloadableReport $report) { $name = $report->getName(); // 下载文件…… } }
我们现在可以把 UsersReport
或 BlogReport
对象传入 downloadReportPDF
方法中,而且不会出现任何错误。这是因为我们知道该对象实现了报告类的必要方法,并且将返回我们期望的数据类型。
通过向方法传递了一个接口,而不是一个具体的类,我们可以根据方法的实际作用(而不是方法的实现原理)来解耦 ReportDownloadService
类和这些报告类。
如果我们想创建一个新的 AnalyticsReport
,我们可以让它实现相同的接口。这样一来,我们不必添加任何新的方法,只需要将报告对象传递给同一个的 downloadReportPDF()
方法。如果你正在构建你自己的包或框架,接口可能对你特别有用。你只需要告诉使用者要实现哪个接口,然后他们就可以创建自己的类。例如,在 Laravel 中,我们可以通过实现 Illuminate\Contracts\Cache\Store
接口来创建自己的自定义缓存驱动类。
除了能改进代码之外,我喜欢使用接口的另一个原因是 —— 它们起到了“代码即文档”的作用。例如,如果我想弄清楚一个类能做什么,不能做什么,我倾向于先看接口,然后再看实现它的类。接口能够告诉我们所有可被调用的方法,而不需要我们过多地关心这些方法的底层实现方式是怎样的。
值得注意的是,Laravel
中的“契约(contract)”和“接口(interface)”这两个词语是可互换的。根据 Laravel 文档,“契约是一组由框架提供的核心服务的接口”。所以,记住:契约是一个接口,但接口不一定是契约。通常情况下,契约只是框架提供的一个接口。关于使用契约的更多信息,我建议大家可以阅读这一篇文档。它很好地剖析了契约究竟是什么,也对使用契约的方式与场景做了一定的叙述。
希望通过阅读这篇文章,你能对什么是接口、如何在 PHP 中使用接口以及使用接口的好处有一个简单的了解。
原文地址:https://dev.to/ashallendesign/using-interfaces-to-write-better-php-code-391f
原文作者:Ash Allen
译者:kamly、jaredliw
推荐学习:《PHP视频教程》
Atas ialah kandungan terperinci Apakah antara muka? Bagaimana untuk menulis kod elegan menggunakan antara muka dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!