iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >什么是接口?如何在PHP中使用接口编写优雅的代码?
  • 389
分享到

什么是接口?如何在PHP中使用接口编写优雅的代码?

php接口 2022-08-08 13:08:45 389人浏览 安东尼
摘要

什么是接口?如何在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 中,我们可以通过实现 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中使用接口编写优雅的代码?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 什么是接口?如何在PHP中使用接口编写优雅的代码?

本文链接: https://www.lsjlt.com/news/33565.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是接口?如何在PHP中使用接口编写优雅的代码?
    什么是接口?如何在PHP中使用接口?本篇文章带大家聊聊使用接口编写更优雅的 PHP 代码,希望对大家有所帮助!在编程中,确保代码可读、可维护、可扩展和易于测试是很重要的;而使用接口,恰恰是我们改进代码中所有这些因素的方法之一。目标读者本文的...
    99+
    2022-08-08
    php 接口
  • Go编程算法中的接口详解:如何优雅地实现代码复用?
    Go语言作为一门高效的编程语言,其拥有着非常灵活的接口设计。这些接口不仅可以帮助我们优雅地实现代码复用,还可以让我们更好地组织代码结构,提高代码的可读性和可维护性。本文将深入探讨Go编程算法中的接口,以及如何优雅地实现代码复用。 接口是什...
    99+
    2023-10-23
    接口 教程 编程算法
  • 如何在Linux中使用Python编写Bash接口?
    在Linux系统中,Bash是一种非常常用的命令行交互式解释器,而Python则是一种非常流行的编程语言。如果您想将这两者结合起来,实现更加高效的脚本编写,那么您可以在Linux中使用Python编写Bash接口。本文将介绍如何实现这一目标...
    99+
    2023-07-09
    bash linux 接口
  • 如何在Linux中使用Go编写Shell接口?
    Shell是Linux系统中非常重要的一个部分,它是用户与操作系统之间的桥梁,可以通过Shell来执行各种命令和操作。而Go语言是一门非常流行的编程语言,它可以用来编写高效的系统程序。在本文中,我们将介绍如何使用Go语言来编写Shell接...
    99+
    2023-10-21
    shell 接口 linux
  • 如何在python中使用flask编写一个接口
    本篇文章为大家展示了如何在python中使用flask编写一个接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几...
    99+
    2023-06-15
  • 如何在Django中使用GO语言编写的接口?
    Django 是一个优秀的 Python Web 框架,它提供了丰富的功能和强大的扩展性,使得我们可以方便地构建高性能、高效、安全的 Web 应用程序。然而,随着互联网技术的发展,越来越多的 Web 应用程序需要与其他语言编写的服务进行交互...
    99+
    2023-10-26
    ide django 接口
  • 如何在 PHP 中编写响应 Bash 请求的接口?
    PHP 是一种广泛使用的编程语言,因其易于学习和使用而受到很多开发者的喜爱。在本文中,我们将探讨如何在 PHP 中编写响应 Bash 请求的接口。 Bash 是一种 Unix shell,它是一种命令行界面,用于与操作系统进行交互。在 Ba...
    99+
    2023-07-25
    接口 bash 响应
  • 如何使用PHP编写Unix系统中的实时接口?
    PHP是一种流行的服务器端脚本语言,它可以帮助我们轻松地构建Web应用程序。除了Web应用程序之外,PHP还可以用于编写Unix系统的实时接口。这篇文章将介绍如何使用PHP编写Unix系统中的实时接口。 第一步是了解什么是Unix系统中的...
    99+
    2023-09-13
    实时 unix 接口
  • 如何使用 Python 在 Windows 系统中编写 JavaScript 接口?
    在现代 Web 开发中,JavaScript 是一种非常流行的语言。然而,有时候我们需要在不同的语言之间进行通信,这时候就需要编写接口。本文将介绍如何使用 Python 在 Windows 系统中编写 JavaScript 接口。 安装...
    99+
    2023-08-11
    windows 接口 javascript
  • 如何使用PHP编写安全可靠的Shell接口?
    PHP是一种流行的服务器端脚本语言,可用于创建动态Web页面和应用程序。Shell是一种通用的命令行界面,用于执行各种任务和管理操作系统。当这两种技术结合在一起时,可以创建一个功能强大的Shell接口,使用户能够与服务器进行交互并执行各种操...
    99+
    2023-08-31
    shell 接口 编程算法
  • 什么是ASP接口?如何使用IDE和Shell来优化ASP接口的开发?
    ASP(Active Server Pages)是一种在Web服务器上执行的动态网页技术,使用ASP可以方便地生成动态内容、访问数据库、处理表单等。而ASP接口则是ASP与其他程序之间进行数据交互的重要工具。本文将介绍ASP接口的基本概念...
    99+
    2023-10-11
    接口 ide shell
  • 如何在Linux中使用Java接口编写高效的编程算法?
    在Linux中使用Java接口编写高效的编程算法可以极大地提高程序的效率和性能,让代码更加优美和易于维护。下面将介绍一些技巧和方法,帮助你在Linux中使用Java接口编写高效的编程算法。 一、使用Java接口 Java接口是一种定义方法的...
    99+
    2023-08-21
    接口 编程算法 linux
  • 如何在 LeetCode 中优化 Java 接口的使用?
    随着算法和数据结构的重要性越来越受到重视,LeetCode 已经成为了程序员们刷题的重要平台。而在LeetCode中使用Java接口也是常见的操作。本文将介绍一些在 LeetCode 中优化 Java 接口的使用的方法,帮助您更好地完成编程...
    99+
    2023-10-15
    leetcode 接口 面试
  • 如何使用PHP编写可用于BASH接口的高效函数?
    在当今数字时代,我们的日常生活越来越离不开计算机和互联网。编程语言是计算机语言,是一种人和计算机交互的方式。PHP是一种广泛使用的编程语言,它可以用于编写Web应用程序,也可以用于编写系统级程序。在本文中,我们将讨论如何使用PHP编写可用...
    99+
    2023-07-30
    bash 接口 函数
  • PHP 接口中的重定向容器是什么?如何使用?
    在 PHP 接口开发中,重定向容器是一个非常有用的工具。这个容器可以让你重定向到另一个页面或地址,并且也可以处理重定向时的错误。在本篇文章中,我们将介绍 PHP 接口中的重定向容器是什么,以及如何使用它。 什么是重定向容器? 重定向容器是...
    99+
    2023-09-15
    接口 重定向 容器
  • 如何使用PHP创建不需要接口的转账代码
    在现今数字化的时代,许多人都喜欢网上交易。随着网络技术的不断发展,网络支付变得越来越普遍。在网络支付过程中,转账是一个关键步骤。转账是指将一定金额从一个账户转移到另一个账户。在过去,我们可能需要亲自去银行办理转账业务。现在,我们可以通过网络...
    99+
    2023-05-14
  • 如何在Windows系统中使用Python编写高效的算法和接口?
    Python是一种强大的编程语言,可以用于各种任务,包括算法和接口开发。Python在Windows操作系统上的安装和使用非常简单,可以通过下载和安装Python官方发行版来开始编写代码。在本文中,我们将讨论如何在Windows系统中使用...
    99+
    2023-08-31
    windows 编程算法 接口
  • 实时接口在 Python 编程算法中的作用是什么?
    Python 是一种流行的编程语言,广泛应用于数据科学、机器学习、人工智能等领域。在 Python 编程中,实时接口是一种非常重要的工具,可以帮助开发人员实现实时数据处理和通信。 实时接口是什么? 实时接口是一种连接计算机系统和其他设备的通...
    99+
    2023-10-02
    编程算法 接口 实时
  • Java并发编程:如何在多线程环境下优雅地使用接口处理文件?
    在多线程环境下处理文件是一个常见的需求。Java提供了多种处理文件的API,例如File、BufferedReader、BufferedWriter等等。然而,在多线程环境下,使用这些API可能会导致线程安全问题。为了解决这个问题,我们可...
    99+
    2023-10-16
    并发 接口 文件
  • 如何避免在 IDE 中编写 PHP 接口编程算法时的常见错误?
    随着 PHP 语言的不断发展,越来越多的程序员开始使用 PHP 来编写接口编程算法。但是,由于 PHP 语言的特殊性质,有些程序员在编写接口时会犯一些常见的错误。本文将为大家介绍如何避免在 IDE 中编写 PHP 接口编程算法时的常见错误...
    99+
    2023-06-14
    接口 编程算法 ide
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作