成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

什么是接口?如何在PHP中使用接口編寫(xiě)優(yōu)雅的代碼?

什么是接口?如何在PHP中使用接口?本篇文章帶大家聊聊使用接口編寫(xiě)更優(yōu)雅的 PHP 代碼,希望對(duì)大家有所幫助!

什么是接口?如何在PHP中使用接口編寫(xiě)優(yōu)雅的代碼?

在編程中,確保代碼可讀、可維護(hù)、可擴(kuò)展和易于測(cè)試是很重要的;而使用接口,恰恰是我們改進(jìn)代碼中所有這些因素的方法之一。

目標(biāo)讀者

本文的目標(biāo)讀者是對(duì) OOP(面向?qū)ο缶幊蹋└拍钣谢玖私獠⒃?PHP 中使用繼承的開(kāi)發(fā)人員。如果你知道如何在 PHP 代碼中使用繼承,那么你應(yīng)該可以很好地理解本文。

什么是接口?

簡(jiǎn)而言之,接口只是對(duì)類應(yīng)該做什么的描述,它們可用于確保實(shí)現(xiàn)該接口的任何類都將包括在其內(nèi)部定義的每個(gè)公共方法。

接口可以

  • 用于定義類的公共方法;
  • 用于定義類的常量。

接口不可以

  • 被實(shí)例化;
  • 用于定義類的私有或受保護(hù)方法;
  • 用于定義類的屬性。

接口是用來(lái)定義一個(gè)類應(yīng)該包括的公共方法的。記住,你只需要在接口里定義方法的簽名,而不需要包含方法的主體(就像通常在類中看到的方法一樣)。**這是因?yàn)榻涌趦H用于定義對(duì)象之間的通信,而不是像在類中那樣定義通信和行為。**為了說(shuō)明這個(gè)問(wèn)題,下面展示了一個(gè)定義了幾個(gè)公共方法的示例接口:

interface DownloadableReport {     public function getName(): string;      public function getHeaders(): array;      public function getData(): array; }

根據(jù) php.net 文檔我們可以知道,接口有兩個(gè)主要用途:

  • 允許開(kāi)發(fā)者創(chuàng)建不同類別的對(duì)象,這些對(duì)象可以互換使用,因?yàn)樗鼈儗?shí)現(xiàn)了相同的一個(gè)或多個(gè)接口。常見(jiàn)的例子包含:多個(gè)數(shù)據(jù)庫(kù)訪問(wèn)服務(wù)、多個(gè)支付網(wǎng)關(guān)、不同的緩存策略等。不同的實(shí)現(xiàn)之間可以互換,而不需要對(duì)使用它們的代碼進(jìn)行任何修改。

  • 允許函數(shù)或方法接受符合接口的參數(shù)并對(duì)其進(jìn)行操作,而不關(guān)心該對(duì)象還可以做什么或它是如何實(shí)現(xiàn)的。這些接口通常被命名為 IterableCacheableRenderable 等,來(lái)說(shuō)明這些接口的實(shí)際含義。

在 PHP 中使用接口

接口是 OOP(面向?qū)ο缶幊蹋┐a庫(kù)的重要部分。接口能讓我們降低代碼耦合并提高可擴(kuò)展性。舉個(gè)例子,讓我們看看下面這個(gè)類:

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

如你所見(jiàn),我們定義了一個(gè)類,類中有一個(gè)函數(shù),返回一個(gè)字符串。這樣一來(lái),我們定義了該方法的行為,所以我們知道 getName() 是如何返回字符串的。不過(guò),假設(shè)我們?cè)诹硪粋€(gè)類調(diào)用這個(gè)方法;這個(gè)類不需要關(guān)心這個(gè)字符串如何構(gòu)建的,它只關(guān)心該方法是否返回內(nèi)容。舉例來(lái)說(shuō),讓我們看看如何在另一個(gè)類調(diào)用此方法:

class ReportDownloadService {     public function downloadPDF(BlogReport $report)     {         $name = $report->getName();          // 下載文件……     } }

盡管上面的代碼正常運(yùn)行,但我們?cè)O(shè)想一下,現(xiàn)在想給 UsersReport 類中增加下載用戶報(bào)告的功能。顯然,我們不能使用 ReportDownloadService 中的現(xiàn)有方法,因?yàn)槲覀円呀?jīng)強(qiáng)制規(guī)定方法只能傳遞 BlogReport 類。因此,我們必須修改把原有的下載方法名稱改掉(避免重名),然后另外再添加一個(gè)類似的方法,如下所示:

class ReportDownloadService {     public function downloadBlogReportPDF(BlogReport $report)     {         $name = $report->getName();          // 下載文件……     }      public function downloadUsersReportPDF(UsersReport $report)     {         $name = $report->getName();          // 下載文件……     } }

假設(shè)上面的方法中的下載文件部分(注釋掉的部分)使用了相同的代碼,而且我們可以將這些相同的代碼單獨(dú)寫(xiě)成一個(gè)方法,但我們?nèi)詴?huì)有一些重復(fù)的代碼(譯者注:指的是每個(gè)方法中都會(huì)有 $name = $report->getName();)以及有多個(gè)幾乎相同的類的入口。這可能會(huì)給將來(lái)擴(kuò)展代碼或測(cè)試帶來(lái)額外的工作量。

例如,假設(shè)我們創(chuàng)建了一個(gè)新的 AnalyticsReport;我們現(xiàn)在需要向該類添加一個(gè)新的 downloadAnalyticsReportPDF() 方法。你可以清晰的看到這個(gè)文件將如何膨脹(譯者注:指每增加一個(gè)類型,就要增加一個(gè)下載方法)。這就是一個(gè)使用接口的完美場(chǎng)景!

讓我們從創(chuàng)建第一個(gè)接口開(kāi)始:讓我們將其命名為 DownloadableReport,定義如下:

interface DownloadableReport {     public function getName(): string;      public function getHeaders(): array;      public function getData(): array; }

我們現(xiàn)在可以更新 BlogReportUsersReport 來(lái)實(shí)現(xiàn) DownloadableReport 接口,如下例所示。但是請(qǐng)注意,作為演示用途,我故意把 UsersReport 中的代碼寫(xiě)錯(cuò)了:

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.'];     } }
class UsersReport implements DownloadableReport {     public function getName()     {         return ['Users Report'];     }      public function getData(): string     {         return 'The data for the report is here.';     } }

但當(dāng)我們嘗試運(yùn)行代碼的時(shí)候,我們將會(huì)收到錯(cuò)誤,原因如下:

  • 缺少 getHeaders() 方法.

  • getName() 方法不包括接口的方法簽名中定義的返回類型。

  • getData() 方法定義了一個(gè)返回類型,但它與接口的方法簽名中定義的類型不同。

因此,為了修復(fù) UsersReport 使其正確實(shí)現(xiàn) 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.'];     } }

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

class ReportDownloadService {     public function downloadReportPDF(DownloadableReport $report)     {         $name = $report->getName();          // 下載文件……     }  }

我們現(xiàn)在可以把 UsersReportBlogReport 對(duì)象傳入 downloadReportPDF 方法中,而且不會(huì)出現(xiàn)任何錯(cuò)誤。這是因?yàn)槲覀冎涝搶?duì)象實(shí)現(xiàn)了報(bào)告類的必要方法,并且將返回我們期望的數(shù)據(jù)類型。

通過(guò)向方法傳遞了一個(gè)接口,而不是一個(gè)具體的類,我們可以根據(jù)方法的實(shí)際作用(而不是方法的實(shí)現(xiàn)原理)來(lái)解耦 ReportDownloadService類和這些報(bào)告類。

如果我們想創(chuàng)建一個(gè)新的 AnalyticsReport,我們可以讓它實(shí)現(xiàn)相同的接口。這樣一來(lái),我們不必添加任何新的方法,只需要將報(bào)告對(duì)象傳遞給同一個(gè)的 downloadReportPDF() 方法。如果你正在構(gòu)建你自己的包或框架,接口可能對(duì)你特別有用。你只需要告訴使用者要實(shí)現(xiàn)哪個(gè)接口,然后他們就可以創(chuàng)建自己的類。例如,在 Laravel 中,我們可以通過(guò)實(shí)現(xiàn) IlluminateContractsCacheStore 接口來(lái)創(chuàng)建自己的自定義緩存驅(qū)動(dòng)類。

除了能改進(jìn)代碼之外,我喜歡使用接口的另一個(gè)原因是 —— 它們起到了“代碼即文檔”的作用。例如,如果我想弄清楚一個(gè)類能做什么,不能做什么,我傾向于先看接口,然后再看實(shí)現(xiàn)它的類。接口能夠告訴我們所有可被調(diào)用的方法,而不需要我們過(guò)多地關(guān)心這些方法的底層實(shí)現(xiàn)方式是怎樣的。

值得注意的是,Laravel 中的“契約(contract)”和“接口(interface)”這兩個(gè)詞語(yǔ)是可互換的。根據(jù) Laravel 文檔,“契約是一組由框架提供的核心服務(wù)的接口”。所以,記住:契約是一個(gè)接口,但接口不一定是契約。通常情況下,契約只是框架提供的一個(gè)接口。關(guān)于使用契約的

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
囯产精品一品二区三区| 中文手机电影在线观看| 国产无遮挡无码视频在线观看不卡| 又大又硬又粗再深一点| 无码色AV一二区在线播放| 欧美人与动性XXXXBBBB| 久久国产精品日本波多野结衣 | 欧美变态口味重另类在线视频| 精品人妻潮喷久久久又裸又黄| 国产肥熟女视频一区二区三区 | 国产免费一区二区三区不卡| 动漫AV纯肉无码AV在线播放| JαPαηeseHD熟女熟妇伦| 一本大道香蕉在线资源| 亚洲成A人片在线观看国产| 午夜福利麻豆国产精品| 玩弄老太太的BB| 试看AAAA啪啪片120秒| 日本熟妇HD人妻| 强行糟蹋人妻HD中文字幕| 欧美大屁股XXXX高跟欧美黑人| 人体色窝窝7777777| 人妻人人做人碰人人添青青| 欧美三级在线播放| 欧美日韩不卡合集视频| 孰妇XXXXXX的性生话| 亚洲AV无码专区里番在线观看 | 国产激情一区二区三区视频免樱桃 | 国产又黄又大又粗视频| 国产丰满麻豆HDXVIDEOS| 精品无码成人片一区二区98| 精品人妻系列无码人妻漫画| 欧美粗大无套GAY| 污污网站18禁在线永久免费观看| 亚洲午夜无码久久| 亚洲精品无码高潮喷水在线| 亚洲乱码一区二区三区| 亚洲日本一线产区二线产区| 亚洲中文字幕无码AV| 影音先锋2017AV天堂| 在线观看免费视频| 99国精产品W灬源码1688钻| JAVA强行VIDEOS| 国产清纯在线一区二区WWW| 国产亚洲精品视觉盛宴| 国内精品久久久久精免费| 极品VPSWINDOWS少妇| 久久精品国产亚洲AV成人| 麻豆AV无码精品一区二区| 蜜臀少妇人妻在线| 欧美精品视频一区二区三区| 小雪尝禁果又粗又大的中国地图| 亚洲AV永久爆乳无码5区| 999久久久免费精品国产| 国产精品秘入口18禁麻豆免会员| 国内精品伊人久久久久妇| 精品无人区一区二区三区在线| 亲子乱AⅤ一区二区三区| 亚洲成AV人在线观看| 办公室强肝的播出时间| 国产成人无码A区视频在线观看 | 无翼乌全彩工口里番库| 97久久人人超碰超碰窝窝| 超高级国王游戏电影| 国产成人无码AV一区二区| 麻豆日产精品卡2卡3卡4卡5卡 | 婷婷蜜桃国产精品一区| 性少妇JEALOUSVUE片| 亚洲婷婷月色婷婷五月| 高潮奶水涨喷在线播放| 韩国乱码片免费看| 久久69精品久久久久久HB| 蜜臀人妻四季AV一区二区不卡| 性高湖久久久久久久久| 把她按在桌上疯狂顶撞| 国产精品久久久久久亚洲AV| 精品久久久无码中文字幕天天| 日韩精品免费一线在线观看| 性欧美18-19SEX性高清播| 把腿张开老子臊烂你多P| 久久人妻无码中文字幕| 日本丰满的人妻HD高清在线| 西方44大但人文艺术是什么东西| 亚洲中文字幕无码一区无广告 | 亚洲AV无码一区二区二三区软件| 亚洲欧美妆和亚洲妆的区别| 99精品又大又爽又粗少妇毛片 | AV无码专区亚洲AVL在线观看 | 睡着了强行挺进岳身体| 亚洲成av人无码| 国产AV大陆精品一区二区三区 | 欧美性猛交一区二区三区精品| 色WWW亚洲国产阿娇| 亚洲国产成人精品无码区在线秒播| 撞击成熟美妇老师后臀| 丰满人妻一区二区三区免费视频 | 年轻 娇小 亚洲人 日本语 夹| 日本乱人伦AⅤ精品| 中文字AV字幕在线观看| 精品亚洲国产成人AV在线小说| 亚欧乱色国产精品免费九库| 囯产精品一品二区三区| 日本老熟妇毛茸茸| CHINESEXXXXHD麻豆| 国精产品一二二区视早餐有限 | 亚洲性日韩精品一区二区三区| 国精产品W灬源码1688伊| 无码人妻精品一区二区三| 英语老师乖乖挽起裙子怎么写作文 | 欧美VIDEOSDESXO孕交| 制服 丝袜 有码 无码 中文| 国产成人片AⅤ在线观看| 人人妻人人澡人人爽人人精品浪潮 | 麻豆我精产国品一二三产区区别| 亚洲熟妇AV一区二区三区下载| 成人国产三级在线观看| 久久久国产精品无码免费专区| 少妇自慰喷AV免费网站| 成熟女人牲交片免费观看视频| 久久久久精品无码AV| 特级XXXXX欧美| 3D动漫同人精品无码专区| 国内精品久久久久久久影视| 无人区一码一码二码三码区别| 国产成人无码精品一区在线观看| 日韩亚洲欧美久久久WWW综合| 伊人久久大香线蕉AV成人| 久久精品国产亚洲AV高清漫画| 亚洲人成人无码WWW影院| 久久R热这里只有精品| 亚洲性无码一区二区三区| 久久久久精品国产亚洲AV| 一区二区在线视频| 国偷自产视频一区二区久| 性饥渴少妇XXXXⅩHD| 国内精品自线在拍大学生| 亚洲丰满性熟妇ⅩXXOOO太阳| 娇小性XXXXX极品娇小| 天堂国品一二三产品区别大吗| 自偷自拍亚洲综合精品麻豆| 蜜桃av一区二区三区精品人妻| 综合图区亚洲另类偷窥| 欧美精欧美乱码一二三四区| 亚洲无人区码一码二码三码四码| 久久精品国产国产精品四凭| 一二三四在线视频社区8| 免费观看国产小粉嫩喷水精品午| 亚洲精品偷拍自综合网| 久久AV无码ΑV高潮ΑV喷吹| 国产乱子伦60女人的皮视频| 欧美成人午夜免费全部完| きょこんきょうしゃ在线| 7777788888管家婆中特| 免费120秒体验试看5次| 最新的国产成人精品2022| 久久久久亚洲AV成人片一区| 蜜臀AⅤ免费网站| 亚洲精品乱码久久久久久V| 国产一二三四区中| 97在线视频免费观看| 久久精品人人做人人爽电影蜜月| 一日本道A高清免费播放| 欧美成人AⅤ高清免费观看| 本道久久综合无码中文字幕| 久久精品A亚洲国产V高清不卡| 在线观看国产成人AⅤ天堂| 全国主要城市天气预报| 97porm国内自拍视频| 日本高清乱理伦片中文字幕| 国产精品99久久久久久猫咪| 揉着我的奶从后面进去视频| 国产精品视频一区二区| 亚洲欧美丝袜 动漫专区| 内谢少妇XXXXX8老少交| 丰满大爆乳波霸奶| 亚洲成AV人在线视达达兔| 毛片TV网站无套内射TV网站| 菠萝蜜视频在线观看| 性少妇中国内射XXXX狠干| 久久夜色精品国产亚洲| 亚洲综合大片6999| 欧美人与禽XOXO牲伦交| 国产精品V片在线观看不卡| 亚洲一区在线曰日韩在线| 欧洲老人毛多BBWBBWBBW| 国产精品无码久久久久久| 影音先锋女人AV女色资源| 日韩乱码人妻无码超清蜜桃丨| 成人精品免费视频在线观看| 亚洲 日韩 激情 无码 中出| 乱人伦人妻中文字幕不卡| 岛国岛国免费V片在线观看| 色综合色综合色综合色欲| 高清性色生活片97| 亚洲女和黑人最新AV| 人妻精品丝袜一区二区无码AV| 国产亚洲精品第一综合| 2021国产精品国产精华| 欧美性BBBBBXXXXX4050免费看| 国产精品免费久久久久久蜜桃|