Rumah > pembangunan bahagian belakang > tutorial php > Apakah antara muka? Bagaimana untuk menulis kod elegan menggunakan antara muka dalam PHP?

Apakah antara muka? Bagaimana untuk menulis kod elegan menggunakan antara muka dalam PHP?

青灯夜游
Lepaskan: 2023-04-11 07:00:01
ke hadapan
3371 orang telah melayarinya

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!

Apakah antara muka? Bagaimana untuk menulis kod elegan menggunakan antara muka dalam PHP?

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.

Khalayak Sasaran

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.

Apakah itu antara muka?

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 :

  • digunakan untuk mentakrifkan kaedah awam kelas
  • digunakan untuk mentakrifkan pemalar kelas .

Antaramuka tidak boleh:

  • digunakan untuk mentakrifkan kaedah persendirian atau yang dilindungi daripada kelas
  • digunakan untuk mentakrifkan atribut kelas.
  • Antara muka digunakan untuk mentakrifkan kaedah awam yang perlu disertakan oleh kelas. Ingat, anda hanya perlu mentakrifkan tandatangan kaedah dalam antara muka, dan anda tidak perlu memasukkan badan kaedah (seperti yang biasa anda lihat kaedah dalam kelas). **Ini kerana antara muka hanya digunakan untuk menentukan komunikasi antara objek, bukan untuk menentukan komunikasi dan tingkah laku seperti dalam kelas. **Untuk menggambarkan masalah ini, yang berikut menunjukkan antara muka contoh yang mentakrifkan beberapa kaedah awam:

Menurut dokumen
interface DownloadableReport
{
    public function getName(): string;

    public function getHeaders(): array;

    public function getData(): array;
}
Salin selepas log masuk
Salin selepas log masuk
php.net

kita boleh tahu bahawa antara muka mempunyai dua utama Tujuan:

    membenarkan pembangun mencipta kelas objek yang berbeza yang boleh digunakan secara bergantian kerana mereka melaksanakan antara muka atau antara muka yang sama. Contoh biasa termasuk: perkhidmatan capaian pangkalan data berbilang, gerbang pembayaran berbilang, strategi caching yang berbeza, dsb. Pelaksanaan yang berbeza boleh ditukar ganti tanpa memerlukan sebarang pengubahsuaian pada kod yang menggunakannya.
  • Membenarkan fungsi atau kaedah menerima parameter yang mematuhi antara muka dan beroperasi padanya, tanpa mempedulikan perkara lain yang boleh dilakukan oleh objek atau cara ia dilaksanakan. Antara muka ini biasanya dinamakan
  • ,

    , Iterable, dsb. untuk menerangkan maksud antara muka ini sebenarnya. CacheableRenderable

Menggunakan Antara Muka dalam PHP

Antaramuka ialah bahagian penting dalam pangkalan kod OOP (Pengaturcaraan Berorientasikan Objek). Antara muka membolehkan kami mengurangkan gandingan kod dan meningkatkan kebolehskalaan. Sebagai contoh, mari kita lihat kelas berikut:

Seperti yang anda lihat, kami telah menentukan kelas dengan fungsi yang mengembalikan rentetan. Dengan cara ini, kami mentakrifkan kelakuan kaedah, jadi kami tahu cara
class BlogReport
{
    public function getName(): string
    {
        return 'Blog report';
    }
}
Salin selepas log masuk
mengembalikan rentetan. Walau bagaimanapun, katakan kita memanggil kaedah ini dalam kelas lain; kelas ini tidak perlu mengambil berat tentang bagaimana rentetan itu dibina, ia hanya mengambil berat tentang sama ada kaedah itu mengembalikan kandungan. Sebagai contoh, mari lihat cara memanggil kaedah ini dalam kelas lain:

getName()

Walaupun kod di atas berjalan seperti biasa, mari bayangkan bahawa kita kini mahu menambah laporan pengguna muat turun ke fungsi kelas
class ReportDownloadService
{
    public function downloadPDF(BlogReport $report)
    {
        $name = $report->getName();

        // 下载文件……
    }
}
Salin selepas log masuk
. Jelas sekali, kami tidak boleh menggunakan kaedah sedia ada dalam

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: ReportDownloadServiceBlogReport

Andaikan bahawa fail muat turun dalam kaedah di atas Bahagian ( mengulas bahagian) menggunakan kod yang sama, dan kita boleh menulis kod yang sama ini ke dalam kaedah yang berasingan, tetapi kita masih akan mempunyai beberapa kod berulang (Nota Penterjemah: Merujuk kepada terdapat ) dan terdapat berbilang entri daripada kelas yang hampir sama. Ini boleh mencipta kerja tambahan untuk melanjutkan kod atau ujian pada masa hadapan.
class ReportDownloadService
{
    public function downloadBlogReportPDF(BlogReport $report)
    {
        $name = $report->getName();

        // 下载文件……
    }

    public function downloadUsersReportPDF(UsersReport $report)
    {
        $name = $report->getName();

        // 下载文件……
    }
}
Salin selepas log masuk

Sebagai contoh, katakan kita mencipta $name = $report->getName(); baharu; kita kini perlu menambah kaedah

baharu pada kelas itu. Anda boleh melihat dengan jelas bagaimana fail ini akan berkembang. Ini adalah senario yang sempurna untuk menggunakan antara muka!

AnalyticsReport Mari mulakan dengan mencipta antara muka pertama kami: Mari namakannya downloadAnalyticsReportPDF() dan takrifkannya seperti berikut:

DownloadableReport Kini kami boleh mengemas kini

dan
interface DownloadableReport
{
    public function getName(): string;

    public function getHeaders(): array;

    public function getData(): array;
}
Salin selepas log masuk
Salin selepas log masuk
untuk Melaksanakan

antara muka seperti yang ditunjukkan dalam contoh di bawah. Tetapi sila ambil perhatian bahawa untuk tujuan demonstrasi, saya sengaja menulis kod dalam BlogReport salah: UsersReportDownloadableReportUsersReport

Tetapi apabila kita cuba menjalankan kod, kita akan menerima ralat, sebabnya Seperti berikut :
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.'];
    }
}
Salin selepas log masuk
  • 缺少 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.'];
    }
}
Salin selepas log masuk

现在两个报告类都实现了相同的接口,我们可以这样更新我们的 ReportDownloadService

class ReportDownloadService
{
    public function downloadReportPDF(DownloadableReport $report)
    {
        $name = $report->getName();

        // 下载文件……
    }

}
Salin selepas log masuk

我们现在可以把 UsersReportBlogReport 对象传入 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!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan