真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何用接口寫(xiě)高質(zhì)量PHP代碼

本篇內(nèi)容介紹了“如何用接口寫(xiě)高質(zhì)量PHP代碼”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!                            

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供梅縣網(wǎng)站建設(shè)、梅縣做網(wǎng)站、梅縣網(wǎng)站設(shè)計(jì)、梅縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、梅縣企業(yè)網(wǎng)站模板建站服務(wù),十余年梅縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

概述

在編碼中,有一個(gè)重要的事情是確保你的代碼是可讀的、可維護(hù)的、可擴(kuò)展的、易于測(cè)試的。我們可以改善這些問(wèn)題的方法之一就是使用接口(interface)。

目標(biāo)受眾

本文針對(duì)對(duì) OOP(object oriented programming)概念和 PHP 中的繼承有基本理解的開(kāi)發(fā)者,如果你知道如何在 PHP 中使用繼承,那么這篇文章會(huì)更容易理解一些。

什么是接口?

基本上,接口描述了一個(gè)類「該做什么」。接口被用于確保實(shí)現(xiàn)接口的任何類中都包含接口規(guī)定的公共方法。

接口可以

  • 用于定義類中的公共方法。

  • 用于定義類中的常量。

接口不可以

  • 單獨(dú)實(shí)例化。

  • 用于定義類中的私有(private)或保護(hù)(protected)方法。

  • 用于定義類中的屬性。

接口口用于定義一個(gè)類中應(yīng)該包括的公共方法。需要記住的是,接口只定義了方法名和參數(shù)以及返回值,但不包含方法體。這是因?yàn)榻涌趦H用于定義對(duì)象間的通信,而不是定義類之間通信的具體行為。為了給出一點(diǎn)上下文,這個(gè)實(shí)例展示了一個(gè)定義了幾個(gè)公共方法的示例接口:

interface DownloadableReport
{
    public function getName(): string;

    public function getHeaders(): array;

    public function getData(): array;
}

根據(jù) php.net 介紹,接口有兩個(gè)主要用途:

  1. 允許開(kāi)發(fā)人員創(chuàng)建不同類的對(duì)象,這些對(duì)象可以互換使用,因?yàn)樗鼈儗?shí)現(xiàn)相同的接口。一個(gè)常見(jiàn)的例子是多個(gè)數(shù)據(jù)庫(kù)訪問(wèn)服務(wù),多個(gè)支付網(wǎng)關(guān)或不同的緩存策略??梢愿鼡Q不同的實(shí)現(xiàn),而無(wú)需對(duì)使用它們的代碼進(jìn)行任何更改。

  2. 允許函數(shù)或方法接受符合接口的參數(shù)并對(duì)其進(jìn)行操作,而不關(guān)心對(duì)象還可以做什么或它是如何實(shí)現(xiàn)的。這些接口通常被命名為 Iterable,Cacheable,Renderable 等等來(lái)描述行為的含義?!就扑]學(xué)習(xí):《PHP視頻教程》】

在 PHP 中使用接口

接口是 OOP (面向?qū)ο缶幊? 代碼中非常重要的一部分。它們?cè)试S我們將代碼解耦并提高可擴(kuò)展性。舉一個(gè)例子,讓我們看看下面這個(gè)類:

class BlogReport
{
    public function getName(): string
    {
        return 'Blog report';
    }
}

如您所見(jiàn),我們已經(jīng)定義了一個(gè)帶有返回字符串的方法的類。通過(guò)這樣做,我們已經(jīng)確定了方法的行為,因此我們可以看到getName()是如何構(gòu)建返回的字符串的。但是,假設(shè)我們?cè)诹硪粋€(gè)類中的代碼中調(diào)用此方法。另一個(gè)類并不會(huì)關(guān)心字符串是如何構(gòu)建的,它只關(guān)心它是否被返回。例如,讓我們看看如何在另一個(gè)類中調(diào)用此方法:

class ReportDownloadService
{
    public function downloadPDF(BlogReport $report)
    {
        $name = $report->getName();

        // 在這里下載文件...
    }
}

盡管上面的代碼已經(jīng)可以用了,讓我們?cè)O(shè)想一下,若是我們現(xiàn)在想要在 UserReport 類中增加一個(gè)下載用戶報(bào)告的方法。當(dāng)然,我們不能使用 ReportDownloadService 中已經(jīng)存在的方法,因?yàn)槲覀円呀?jīng)強(qiáng)制只能傳入一個(gè) BlogReport 類。因此,我們必須重命名現(xiàn)有方法,再添加一個(gè)新的方法。像這樣:

class ReportDownloadService
{
    public function downloadBlogReportPDF(BlogReport $report)
    {
        $name = $report->getName();

        // 在這下載文件...
    }

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

        // 在這下載文件...
    }
}

雖然你實(shí)際看不到,但我們假設(shè)上述的類中,其余的方法都使用相同的代碼來(lái)構(gòu)建下載。我們可以將公共的代碼提升為方法,但我們?nèi)匀粫?huì)有一些公共的代碼。除此之外,我們還有多個(gè)進(jìn)入這個(gè)類的幾乎是相同代碼的入口。這可能會(huì)在未來(lái)嘗試擴(kuò)展代碼或添加測(cè)試功能時(shí)導(dǎo)致額外的工作量。

舉個(gè)例子,我們創(chuàng)建一個(gè)新的 AnalyticsReport;我們現(xiàn)在需要為這個(gè)類增加一個(gè)新的 downloadAnalyticsReportPDF() 方法。這時(shí)你可能會(huì)觀察到這個(gè)文件正在快速增長(zhǎng)。這時(shí)就是使用接口的絕佳時(shí)機(jī)。

我們從創(chuàng)建一個(gè)接口開(kāi)始。我們要?jiǎng)?chuàng)建一個(gè)叫做 DownloadableReport 的接口,并這樣定義:

interface DownloadableReport
{
    public function getName(): string;

    public function getHeaders(): array;

    public function getData(): array;
}

我們現(xiàn)在要更改 BlogReportUsersReport 來(lái)實(shí)現(xiàn) DownloadableReport 接口,如下所示。我故意寫(xiě)錯(cuò)了 UsersReport 的代碼來(lái)演示一些東西。

class BlogReport implements DownloadableReport
{
    public function getName(): string
    {
        return '博客報(bào)告';
    }

    public function getHeaders(): array
    {
        return ['頭在這'];
    }

    public function getData(): array
    {
        return ['報(bào)告的數(shù)據(jù)在這里'];
    }
}
class UsersReport implements DownloadableReport
{
    public function getName()
    {
        return ['用戶報(bào)告'];
    }

    public function getData(): string
    {
        return '報(bào)告的數(shù)據(jù)在這里';
    }
}

如果我們嘗試運(yùn)行這段代碼,我們會(huì)得到報(bào)錯(cuò),原因是:

  1. 找不到 getHeaders() 方法。

  2. getName() 方法返回類型在接口中定義的方法返回值類型中。

  3. getData() 方法定義了返回類型,但和接口中定義的返回類型不同。

因此,要讓 UsersReport 正確地實(shí)現(xiàn) DownloadableReport 接口,我們需要作如下變動(dòng):

class UsersReport implements DownloadableReport
{
    public function getName(): string
    {
        return '用戶報(bào)告';
    }

    public function getHeaders(): array
    {
       return [];
    }

    public function getData(): array
    {
        return ['報(bào)告的數(shù)據(jù)在這里'];
    }
}

現(xiàn)在我們兩個(gè)報(bào)告類都實(shí)現(xiàn)了相同的接口,我們可以像這樣更新我們的 ReportDownloadService

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

        // 在這下載文件
    }

}

現(xiàn)在我們向 downloadReportPDF() 方法傳入了 UsersReportBlogReport 對(duì)象,沒(méi)有任何錯(cuò)誤出現(xiàn)。這是因?yàn)槲覀儸F(xiàn)在知道了報(bào)告類所需要的必要方法,并且報(bào)告類會(huì)按照我們預(yù)期的類型返回?cái)?shù)據(jù)。

向方法傳入接口,而不是向類傳入接口,這樣的結(jié)果使得 ReportDownloadService 和報(bào)告類產(chǎn)生松散耦合,這根據(jù)的是方法做什么,而不是如何做。

如果我們想要?jiǎng)?chuàng)建一個(gè)新的 AnalyticsReport,我們需要讓它實(shí)現(xiàn)相同的接口,然后它就會(huì)允許我們將報(bào)告類實(shí)例傳入相同的 downloadReportPDF() 方法中,而不用添加其他新的方法。如果你正在構(gòu)建自己的應(yīng)用或框架,想要讓其他開(kāi)發(fā)人員有創(chuàng)建給他們自己的類的功能,這將非常有用。舉個(gè)例子,在 Laravel 中,你可以通過(guò)實(shí)現(xiàn) Illuminate\Contracts\Cache\Store 接口來(lái)創(chuàng)建自定義的緩存類。

除了使用接口來(lái)改進(jìn)代碼外,我更傾向于喜歡接口的「代碼即文檔」特性。舉個(gè)例子,如果我想要知道一個(gè)類能做什么和不能做什么,我更喜歡在查看類之前先查看接口。它會(huì)告訴我所有可調(diào)用的方法,而不需要關(guān)心這些方法具體是怎么運(yùn)行的。

對(duì)于像我這樣的 Laravel 開(kāi)發(fā)者來(lái)說(shuō),值得注意的一件事是,你會(huì)經(jīng)??吹?接口 interface契約 contract 交替使用。根據(jù) Laravel 文檔,「Laravel 的契約是一組定義了框架提供的核心服務(wù)的接口」。因此,契約是一個(gè)接口,但接口不一定是契約。通常來(lái)說(shuō),契約只是框架提供的一個(gè)接口。有關(guān)契約的更多內(nèi)容,我建議閱讀一下 文檔,因?yàn)槲艺J(rèn)為它在契約的理解和使用途徑上有很好的見(jiàn)解。

“如何用接口寫(xiě)高質(zhì)量PHP代碼”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


分享標(biāo)題:如何用接口寫(xiě)高質(zhì)量PHP代碼
分享網(wǎng)址:http://weahome.cn/article/jocjdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部