목차
대상
인터페이스란 무엇인가요?
인터페이스
보시다시피 문자열을 반환하는 메서드가 포함된 클래스를 정의했습니다. 이를 통해 메소드의 동작을 결정했으므로 getName()이 반환된 문자열을 어떻게 작성하는지 확인할 수 있습니다. 그러나 다른 클래스의 코드에서 이 메서드를 호출한다고 가정해 보겠습니다. 다른 클래스는 문자열이 어떻게 구성되는지 신경 쓰지 않고 문자열이 반환되는지 여부에만 관심이 있습니다. 예를 들어, 다른 클래스에서 이 메서드를 호출하는 방법을 살펴보겠습니다.
结论
백엔드 개발 PHP 튜토리얼 인터페이스의 의미와 인터페이스를 사용하여 고품질 PHP 코드를 작성하는 방법을 설명하는 기사

인터페이스의 의미와 인터페이스를 사용하여 고품질 PHP 코드를 작성하는 방법을 설명하는 기사

Nov 08, 2021 pm 03:43 PM
interface php

대상

이 글은 PHP의 OOP(객체 지향 프로그래밍) 개념과 상속에 대한 기본적인 이해가 있는 개발자를 대상으로 합니다. PHP에서 상속을 사용하는 방법을 알고 있다면 이 글을 더 쉽게 이해할 수 있습니다.

인터페이스란 무엇인가요?

기본적으로 인터페이스는 "클래스가 수행해야 하는 작업"을 설명합니다. 인터페이스는 인터페이스를 구현하는 모든 클래스에 인터페이스에서 지정한 공용 메서드가 포함되어 있는지 확인하는 데 사용됩니다.

인터페이스

:

클래스에서 공개 메소드를 정의하는 데 사용될 수 있습니다.

클래스에서 상수를 정의하는 데 사용됩니다.
  • 인터페이스
  • 할 수 없습니다:

개별적으로 인스턴스화할 수 있습니다.

클래스에서 비공개 또는 보호 메서드를 정의하는 데 사용됩니다.
  • 클래스에서 속성을 정의하는 데 사용됩니다.
  • 인터페이스는 클래스에 포함되어야 하는 공용 메서드를 정의하는 데 사용됩니다. 기억해야 할 점은 인터페이스가 메소드 이름, 매개변수 및 반환 값만 정의할 뿐 메소드 본문은 포함하지 않는다는 것입니다. 인터페이스는 클래스 간 통신의 특정 동작을 정의하는 것이 아니라 객체 간 통신을 정의하는 데만 사용되기 때문입니다. 약간의 맥락을 제공하기 위해 이 예제에서는 여러 공용 메소드를 정의하는 예제 인터페이스를 보여줍니다.
  • interface DownloadableReport
    {
        public function getName(): string;
    
        public function getHeaders(): array;
    
        public function getData(): array;
    }
    로그인 후 복사
    로그인 후 복사
  • php.net에 따르면 인터페이스에는 두 가지 주요 목적이 있습니다.

개발자가 사용할 수 있는 다양한 클래스의 객체를 만들 수 있도록 허용합니다. 동일한 인터페이스를 구현하기 때문에 서로 바꿔서 사용할 수 있습니다. 일반적인 예로는 여러 데이터베이스 액세스 서비스, 여러 결제 게이트웨이 또는 다양한 캐싱 전략이 있습니다. 이를 사용하는 코드를 변경하지 않고도 다양한 구현을 대체할 수 있습니다.

함수나 메서드가 인터페이스에 맞는 매개변수를 받아들이고 개체가 수행할 수 있는 다른 작업이나 구현 방법에 신경 쓰지 않고 해당 매개변수에 대해 작업할 수 있도록 허용합니다. 이러한 인터페이스는 동작의 의미를 설명하기 위해 종종 Iterable, Cacheable, Renderable 등으로 명명됩니다. [추천 학습: "
    PHP 비디오 튜토리얼
  1. "]
  2. PHP에서 인터페이스 사용하기
  3. 인터페이스는 OOP(객체 지향 프로그래밍) 코드에서 매우 중요한 부분입니다. 이를 통해 코드를 분리하고 확장성을 향상할 수 있습니다. 예를 들어 다음 클래스를 살펴보겠습니다.
class BlogReport
{
    public function getName(): string
    {
        return 'Blog report';
    }
}
로그인 후 복사

보시다시피 문자열을 반환하는 메서드가 포함된 클래스를 정의했습니다. 이를 통해 메소드의 동작을 결정했으므로 getName()이 반환된 문자열을 어떻게 작성하는지 확인할 수 있습니다. 그러나 다른 클래스의 코드에서 이 메서드를 호출한다고 가정해 보겠습니다. 다른 클래스는 문자열이 어떻게 구성되는지 신경 쓰지 않고 문자열이 반환되는지 여부에만 관심이 있습니다. 예를 들어, 다른 클래스에서 이 메서드를 호출하는 방법을 살펴보겠습니다.

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

        // 在这里下载文件...
    }
}
로그인 후 복사

위 코드는 이미 작동하지만, 이제 사용자 보고서를 다운로드하기 위해 A 메서드를 추가하려는 경우를 상상해 보겠습니다. 물론 하나의 BlogReport 클래스만 전달해야 했기 때문에 ReportDownloadService의 기존 메소드를 사용할 수 없습니다. 따라서 기존 메소드의 이름을 바꾸고 새로운 메소드를 추가해야 합니다.

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

        // 在这下载文件...
    }

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

        // 在这下载文件...
    }
}
로그인 후 복사

실제로 볼 수는 없지만 위 클래스의 나머지 메소드는 동일한 코드를 사용하여 다운로드를 빌드한다고 가정합니다. 공개 코드를 메소드로 승격할 수 있지만 여전히 일부 공개 코드가 있습니다. 이 외에도 거의 동일한 코드를 사용하여 이 클래스에 여러 항목이 있습니다. 이로 인해 나중에 코드를 확장하거나 테스트 기능을 추가하려고 할 때 추가 작업이 발생할 수 있습니다. getName()是如何构建返回的字符串的。但是,假设我们在另一个类中的代码中调用此方法。另一个类并不会关心字符串是如何构建的,它只关心它是否被返回。例如,让我们看看如何在另一个类中调用此方法:

interface DownloadableReport
{
    public function getName(): string;

    public function getHeaders(): array;

    public function getData(): array;
}
로그인 후 복사
로그인 후 복사

尽管上面的代码已经可以用了,让我们设想一下,若是我们现在想要在 UserReport 类中增加一个下载用户报告的方法。当然,我们不能使用 ReportDownloadService 中已经存在的方法,因为我们已经强制只能传入一个 BlogReport 类。因此,我们必须重命名现有方法,再添加一个新的方法。像这样:

class BlogReport implements DownloadableReport
{
    public function getName(): string
    {
        return '博客报告';
    }

    public function getHeaders(): array
    {
        return ['头在这'];
    }

    public function getData(): array
    {
        return ['报告的数据在这里'];
    }
}
로그인 후 복사

虽然你实际看不到,但我们假设上述的类中,其余的方法都使用相同的代码来构建下载。我们可以将公共的代码提升为方法,但我们仍然会有一些公共的代码。除此之外,我们还有多个进入这个类的几乎是相同代码的入口。这可能会在未来尝试扩展代码或添加测试功能时导致额外的工作量。

举个例子,我们创建一个新的 AnalyticsReport;我们现在需要为这个类增加一个新的 downloadAnalyticsReportPDF() 方法。这时你可能会观察到这个文件正在快速增长。这时就是使用接口的绝佳时机。

我们从创建一个接口开始。我们要创建一个叫做 DownloadableReport 的接口,并这样定义:

class UsersReport implements DownloadableReport
{
    public function getName()
    {
        return ['用户报告'];
    }

    public function getData(): string
    {
        return '报告的数据在这里';
    }
}
로그인 후 복사

我们现在要更改 BlogReport 和 UsersReport 来实现 DownloadableReport 接口,如下所示。我故意写错了 UsersReport

예를 들어, 새로운 AnalyticsReport를 생성했습니다. 이제 이 클래스에 새로운 downloadAnalyticsReportPDF() 메서드를 추가해야 합니다. 이 시점에서 파일이 빠르게 증가하는 것을 볼 수 있습니다. 지금은 인터페이스를 사용하기에 좋은 시기입니다.

인터페이스를 만드는 것부터 시작합니다. DownloadableReport라는 인터페이스를 만들고 다음과 같이 정의하겠습니다. 🎜
class UsersReport implements DownloadableReport
{
    public function getName(): string
    {
        return '用户报告';
    }

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

    public function getData(): array
    {
        return ['报告的数据在这里'];
    }
}
로그인 후 복사
로그인 후 복사
🎜이제 BlogReportUsersReport를 변경하여 구현하겠습니다. DownloadableReport 인터페이스는 아래와 같습니다. 무언가를 보여주기 위해 의도적으로 UsersReport에 잘못된 코드를 작성했습니다. 🎜
class ReportDownloadService
{
    public function downloadReportPDF(DownloadableReport $report)
    {
        $name = $report->getName();

        // 在这下载文件
    }

}
로그인 후 복사
로그인 후 복사
rrreee🎜이 코드를 실행하려고 하면 다음과 같은 이유로 오류가 발생합니다. 🎜
  1. 找不到 getHeaders() 方法。
  2. getName() 方法返回类型在接口中定义的方法返回值类型中。
  3. getData() 方法定义了返回类型,但和接口中定义的返回类型不同。

因此,要让 UsersReport 正确地实现 DownloadableReport 接口,我们需要作如下变动:

class UsersReport implements DownloadableReport
{
    public function getName(): string
    {
        return '用户报告';
    }

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

    public function getData(): array
    {
        return ['报告的数据在这里'];
    }
}
로그인 후 복사
로그인 후 복사

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

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

        // 在这下载文件
    }

}
로그인 후 복사
로그인 후 복사

现在我们向 downloadReportPDF() 方法传入了 UsersReport 或 BlogReport 对象,没有任何错误出现。这是因为我们现在知道了报告类所需要的必要方法,并且报告类会按照我们预期的类型返回数据。

向方法传入接口,而不是向类传入接口,这样的结果使得 ReportDownloadService 和报告类产生松散耦合,这根据的是方法做什么,而不是如何做

如果我们想要创建一个新的 AnalyticsReport,我们需要让它实现相同的接口,然后它就会允许我们将报告类实例传入相同的 downloadReportPDF() 方法中,而不用添加其他新的方法。如果你正在构建自己的应用或框架,想要让其他开发人员有创建给他们自己的类的功能,这将非常有用。举个例子,在 Laravel 中,你可以通过实现 Illuminate\Contracts\Cache\Store 接口来创建自定义的缓存类。

除了使用接口来改进代码外,我更倾向于喜欢接口的「代码即文档」特性。举个例子,如果我想要知道一个类能做什么和不能做什么,我更喜欢在查看类之前先查看接口。它会告诉我所有可调用的方法,而不需要关心这些方法具体是怎么运行的。

对于像我这样的 Laravel 开发者来说,值得注意的一件事是,你会经常看到 接口 interface契约 contract 交替使用。根据 Laravel 文档,「Laravel 的契约是一组定义了框架提供的核心服务的接口」。因此,契约是一个接口,但接口不一定是契约。通常来说,契约只是框架提供的一个接口。有关契约的更多内容,我建议阅读一下 文档,因为我认为它在契约的理解和使用途径上有很好的见解。

结论

阅读本文后,我们希望你能简要地了解到了什么是接口,如何在 PHP 中使用接口,以及使用接口的好处。

对于我的 Laravel 开发者读者们,我下周会更新一篇新的博文,讲解如何在 Laravel 中使用接口实现桥接模式。如果你感兴趣,可以订阅我的网站更新通知,这样当我更新时,你就会收到通知。

如果这篇文章有助于你理解 PHP 接口,我期待在评论区听到你的声音。继续去创造令人惊叹的作品吧!

非常感谢  Aditya Kadam 、 Jae Toole 和 Hannah Tinkler 帮助我校对和改进这篇文章。

原文地址:https://dev.to/ashallendesign/using-interfaces-to-write-better-php-code-391f

译文地址:https://learnku.com/php/t/62228

위 내용은 인터페이스의 의미와 인터페이스를 사용하여 고품질 PHP 코드를 작성하는 방법을 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

See all articles