gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

什么是接口?如何在PHP中使用接口編寫優雅的代碼?

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

什么是接口?如何在PHP中使用接口編寫優雅的代碼?

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

目標讀者

本文的目標讀者是對 OOP(面向對象編程)概念有基本了解并在 PHP 中使用繼承的開發人員。如果你知道如何在 PHP 代碼中使用繼承,那么你應該可以很好地理解本文。

什么是接口?

簡而言之,接口只是對類應該做什么的描述,它們可用于確保實現該接口的任何類都將包括在其內部定義的每個公共方法。

接口可以

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

接口不可以

  • 被實例化;
  • 用于定義類的私有或受保護方法;
  • 用于定義類的屬性。

接口是用來定義一個類應該包括的公共方法的。記住,你只需要在接口里定義方法的簽名,而不需要包含方法的主體(就像通常在類中看到的方法一樣)。**這是因為接口僅用于定義對象之間的通信,而不是像在類中那樣定義通信和行為。**為了說明這個問題,下面展示了一個定義了幾個公共方法的示例接口:

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

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

  • 允許開發者創建不同類別的對象,這些對象可以互換使用,因為它們實現了相同的一個或多個接口。常見的例子包含:多個數據庫訪問服務、多個支付網關、不同的緩存策略等。不同的實現之間可以互換,而不需要對使用它們的代碼進行任何修改。

  • 允許函數或方法接受符合接口的參數并對其進行操作,而不關心該對象還可以做什么或它是如何實現的。這些接口通常被命名為 IterableCacheableRenderable 等,來說明這些接口的實際含義。

在 PHP 中使用接口

接口是 OOP(面向對象編程)代碼庫的重要部分。接口能讓我們降低代碼耦合并提高可擴展性。舉個例子,讓我們看看下面這個類:

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

如你所見,我們定義了一個類,類中有一個函數,返回一個字符串。這樣一來,我們定義了該方法的行為,所以我們知道 getName() 是如何返回字符串的。不過,假設我們在另一個類調用這個方法;這個類不需要關心這個字符串如何構建的,它只關心該方法是否返回內容。舉例來說,讓我們看看如何在另一個類調用此方法:

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

盡管上面的代碼正常運行,但我們設想一下,現在想給 UsersReport 類中增加下載用戶報告的功能。顯然,我們不能使用 ReportDownloadService 中的現有方法,因為我們已經強制規定方法只能傳遞 BlogReport 類。因此,我們必須修改把原有的下載方法名稱改掉(避免重名),然后另外再添加一個類似的方法,如下所示:

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

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

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

讓我們從創建第一個接口開始:讓我們將其命名為 DownloadableReport,定義如下:

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

我們現在可以更新 BlogReportUsersReport 來實現 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.'];     } }
class UsersReport implements DownloadableReport {     public function getName()     {         return ['Users Report'];     }      public function getData(): string     {         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();          // 下載文件……     }  }

我們現在可以把 UsersReportBlogReport 對象傳入 downloadReportPDF 方法中,而且不會出現任何錯誤。這是因為我們知道該對象實現了報告類的必要方法,并且將返回我們期望的數據類型。

通過向方法傳遞了一個接口,而不是一個具體的類,我們可以根據方法的實際作用(而不是方法的實現原理)來解耦 ReportDownloadService類和這些報告類。

如果我們想創建一個新的 AnalyticsReport,我們可以讓它實現相同的接口。這樣一來,我們不必添加任何新的方法,只需要將報告對象傳遞給同一個的 downloadReportPDF() 方法。如果你正在構建你自己的包或框架,接口可能對你特別有用。你只需要告訴使用者要實現哪個接口,然后他們就可以創建自己的類。例如,在 Laravel 中,我們可以通過實現 IlluminateContractsCacheStore 接口來創建自己的自定義緩存驅動類。

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

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

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产精品无码专区av在线播放| 欧美又黄又嫩大片a级| 无码人妻aⅴ一区二区三区日本| 97公开免费视频| 日本老熟妇毛茸茸| 日批视频在线免费看| 男人和女人啪啪网站| 亚洲理论电影在线观看| 国产玉足脚交久久欧美| 波多野结衣与黑人| 人妻激情另类乱人伦人妻| 精品国产三级a∨在线| 日本中文字幕在线不卡| 成人手机在线播放| www.好吊操| 99热在线这里只有精品| 国产免费黄色av| 人人干人人视频| www.国产视频.com| 色婷婷综合在线观看| www.亚洲成人网| 91九色在线观看视频| 欧美伦理片在线观看| 国产成年人在线观看| 无码人妻精品一区二区蜜桃网站| 岛国大片在线播放| 国产又大又黄又粗又爽| 国产又粗又长又爽视频| 欧美日韩在线中文| 手机免费看av网站| 国产91xxx| 在线视频观看一区二区| 日韩国产欧美亚洲| 久久艹这里只有精品| 国产a级一级片| 手机福利在线视频| 中国丰满人妻videoshd | 欧美精品色视频| 日韩a级在线观看| 在线看的黄色网址| av在线播放天堂| 潘金莲激情呻吟欲求不满视频| 在线观看中文av| 成人观看免费完整观看| 自拍偷拍视频在线| av免费在线播放网站| 毛片毛片毛片毛| 999在线观看视频| 午夜宅男在线视频| 日本丰满少妇xxxx| 女同激情久久av久久| 国产树林野战在线播放| 日本www在线播放| 久久久久久久中文| 欧美 日韩 国产 在线观看| 天天夜碰日日摸日日澡性色av| 一区二区三区 欧美| 真实国产乱子伦对白视频| 少妇激情一区二区三区| 99久热在线精品视频| 91激情视频在线| 噜噜噜久久亚洲精品国产品麻豆| 亚洲精品成人在线播放| 1024av视频| 欧美一区二区视频在线播放| 日本中文字幕观看| 激情六月丁香婷婷| 国产精品久久成人免费观看| 午夜精品久久久内射近拍高清| www.午夜色| 久国产精品视频| 天天爽人人爽夜夜爽| 免费看国产一级片| 男人c女人视频| 大地资源网在线观看免费官网| 国产精品自拍视频在线| 久热免费在线观看| 99精品在线免费视频| 蜜臀av色欲a片无码精品一区| 天天av天天操| 四季av一区二区三区| 久久精品视频在线观看免费| 天美星空大象mv在线观看视频| 欧美 日韩 国产 高清| 青春草国产视频| 97中文字幕在线| 丁香六月激情婷婷| 无码av天堂一区二区三区| 黄色片免费在线观看视频| 亚洲第一综合网站| 欧美中日韩在线| 青青草成人免费在线视频| 大陆av在线播放| 北条麻妃在线观看| 无码 制服 丝袜 国产 另类| 91网站在线观看免费| 欧美又粗又长又爽做受| 黄色一级视频片| 亚欧在线免费观看| 1314成人网| 国产精品第157页| 337p粉嫩大胆噜噜噜鲁| 九九热免费精品视频| 在线观看中文av| www.日本少妇| 日韩欧美xxxx| 欧美成人福利在线观看| 国产 日韩 亚洲 欧美| 人妻有码中文字幕| 亚洲18在线看污www麻豆| 一区二区三区日韩视频| 老太脱裤子让老头玩xxxxx| 日韩免费高清在线| 在线观看免费黄色片| 国产欧美日韩网站| 天天干天天操天天做| 成年人看的毛片| 国产精品99久久免费黑人人妻| 一道本在线免费视频| 欧美 日韩 国产在线观看| 17c国产在线| 四虎永久在线精品无码视频| 国产成人精品免费看在线播放| 欧洲av无码放荡人妇网站| 亚洲AV无码成人精品一区| 成熟老妇女视频| 久久这里只有精品23| wwwwwxxxx日本| 久草资源站在线观看| 久久这里只有精品18| 国产又爽又黄ai换脸| 在线视频日韩一区 | 超碰成人在线免费观看| 成人一级片网站| 国产高清av在线播放| 搞av.com| 国产夫妻自拍一区| 玖玖精品在线视频| 亚洲欧美手机在线| 亚洲欧美在线精品| 男人操女人免费软件| 可以在线看的av网站| 久久综合亚洲精品| 51xx午夜影福利| 男人午夜视频在线观看| 手机看片一级片| 免费看涩涩视频| 免费看涩涩视频| 天天干天天av| 亚洲精品永久视频| 涩涩网站在线看| 午夜探花在线观看| 中文字幕第80页| 97超碰人人爱| 国产一区二区三区在线免费| 免费看av软件| 日韩一级特黄毛片| 欧美狂野激情性xxxx在线观| 日本国产中文字幕| 久久国产精品视频在线观看| 拔插拔插海外华人免费| 4444亚洲人成无码网在线观看| 免费国产a级片| 美女网站免费观看视频| 亚洲另类第一页| 日韩成人av免费| 激情视频小说图片| 欧美乱大交xxxxx潮喷l头像| 成熟了的熟妇毛茸茸| 国产视频在线视频| aaa毛片在线观看| 青青在线视频观看| 伊人五月天婷婷| 亚洲国产精品无码观看久久| 成人三级视频在线播放| 精品国产乱码久久久久久1区二区| 中文字幕在线乱| 久久美女福利视频| 国产女同无遮挡互慰高潮91| 欧美三级午夜理伦三级富婆| aa视频在线播放| 亚欧美在线观看| 欧美又粗又长又爽做受| 永久免费的av网站| heyzo亚洲| 中文 日韩 欧美| 黄色av免费在线播放| 久久精品影视大全| 欧美黄色免费网址| 911福利视频| 国产91美女视频| 水蜜桃在线免费观看| 中文字幕 91| 久久精品99国产| 久久这里只有精品23| 成人在线免费观看av| 日韩欧美一区三区| 国产a级黄色大片| 亚洲综合123| 天天干天天av|