>백엔드 개발 >PHP 튜토리얼 >[최신 PHP] Chapter 2 새로운 기능 2 인터페이스 기반 프로그래밍

[최신 PHP] Chapter 2 새로운 기능 2 인터페이스 기반 프로그래밍

WBOY
WBOY원래의
2016-07-30 13:31:19973검색

인터페이스 기반 프로그래밍

PHP 프로그래머로서 인터페이스 기반 프로그래밍 방법을 배우면서 인생이 바뀌었고 타사 PHP 구성 요소를 통합하는 능력이 크게 향상되었습니다. . 내 프로젝트 능력을 향상시키기 위해. 인터페이스는 새로운 기능은 아니지만 일상 업무에서 이해하고 사용해야 하는 중요한 기능입니다.

그럼 PHP의 인터페이스란 정확히 무엇일까요? 인터페이스는 두 개의 PHP 개체 간의 계약입니다. 한 개체가 다른 개체를 호출할 때 상대방이 무엇인지 알 필요는 없고 상대방이 무엇을 할 수 있는지만 알면 됩니다. 인터페이스는 코드의 종속성 결합을 줄여 코드가 원하는 인터페이스를 구현하는 타사 코드를 호출할 수 있게 해줍니다. 우리는 제3자 코드가 인터페이스를 구현하는지 여부에만 관심을 가질 필요가 있으며, 제3자 코드가 이러한 인터페이스를 구현하는 방법에는 전혀 관심을 가질 필요가 없습니다. 실제 사례를 살펴보겠습니다.

Sunshine PHP 개발자 컨퍼런스에 참석하기 위해 플로리다주 마이애미로 간다고 가정해 보겠습니다. 나는 도시를 탐험하고 싶어서 곧바로 현지 렌터카 업체로 갔다. 그들은 현대식 소형차, 스바루 스테이션 왜건, 부가티 베이론(놀랍게도)을 갖고 있었습니다. 나는 단지 시내를 돌아다니기 위한 어떤 형태의 교통수단을 원했고 이 세 대의 차량이 모두 내 필요에 적합하다는 것을 알았습니다. 하지만 차마다 너무 다릅니다. 현대 엑센트도 나쁘지는 않지만 좀 더 다이나믹한 걸 좋아합니다. 저는 아이가 없어서 스테이션 왜건이 아직 좀 크거든요. 그럼 그냥 Bugatti를 선택하세요.

현실적으로는 이 세 대의 자동차가 모두 공통적이고 알려진 인터페이스를 공유하기 때문에 아무 문제 없이 운전할 수 있다는 것입니다. 모든 자동차에는 운전대, 가속 페달, 브레이크 페달, 방향 지시등이 있고 휘발유를 연료로 사용합니다. 그런데 부가티의 힘은 너무 강력해서 도저히 감당이 안 되지만, 현대 자동차의 주행 인터페이스는 똑같습니다. 세 대의 자동차 모두 동일한 인터페이스를 공유하기 때문에 더 마음에 드는 모델을 선택할 수 있는 기회가 있습니다(솔직히 말하면 결국 현대를 선택할 것 같습니다).

PHP의 객체지향 측면에도 동일한 개념이 적용됩니다. 내 코드가 특정 클래스의 개체(특정 구현을 나타냄)를 사용하는 경우 해당 클래스의 개체만 영구적으로 사용할 수 있기 때문에 내 코드의 기능이 매우 제한됩니다. 그러나 내 코드가 인터페이스를 사용하려는 경우 내 코드는 인터페이스를 구현하는 개체를 사용하는 방법을 즉시 알게 됩니다. 내 코드는 인터페이스가 어떻게 구현되는지 전혀 신경 쓸 필요가 없습니다. 내 코드는 객체가 인터페이스를 구현하는지 여부에만 신경을 씁니다. 예를 사용하여 이 모든 것을 명확하게 설명하겠습니다.

다른 데이터 소스에서 데이터를 가져올 수 있는 DocumentStore라는 PHP 클래스가 있다고 가정해 보겠습니다. 이 클래스는 원격 주소에서 HTML을 가져오거나 데이터를 가져올 수도 있습니다. 터미널의 명령줄 출력. DocumentStore 인스턴스에 저장된 각 문서에는 고유한 ID가 있습니다. 예제 2-6에서는 DocumentStore 클래스를 보여줍니다.

예제 2-6 DocumentStore 클래스 정의

class DocumentStore
{
    protected $data = [];

    public function addDocument(Documentable $document)
    {
        $key = $document->getId();
        $value = $document->getContent();
        $this->data[$key] = $value;
    }

    public function getDocuments()
    {
        return $this->data;
    }
}

addDocument 메소드가 매개변수로 문서화할 수 있는 클래스 함수를 설명하시겠습니까? 관찰력이 아주 좋습니다. 사실 Documentable은 클래스가 아니라 인터페이스입니다. 예제 2-7

예제 2-7 Documentable 인터페이스 정의

interface Documentable
{
    public function getId();
    public function getContent();
}

인터페이스 정의에서 Documentable 인터페이스를 구현하는 모든 객체는 공용 getId() 메서드와 공용 getContent() 메서드를 정의해야 함을 알 수 있습니다.

이렇게 하면 어떤 이점이 있나요? 장점은 서로 다른 기능을 가진 여러 문서 획득 클래스를 구성할 수 있다는 것입니다. 예제 2-8에서는 컬을 사용하여 원격 주소에서 HTML을 얻는 인터페이스 구현을 보여줍니다.

예제 2-8 HtmlDocument 클래스 정의

<?php
class HtmlDocument implements Documentable
{
    protected $url;

    public function __construct($url)
    {
        $this->url = $url;
    }

    public function getId()
    {
        return $this->url;
    }

    public function getContent()
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
        $html = curl_exec($ch);
        curl_close($ch);

        return $html;
    }
}

다른 구현(예 2-9)은 지정된 리소스 데이터 흐름을 읽을 수 있습니다. 안에 .

예제 2-9 StreamDocument 클래스 정의

<?php
class StreamDocument implements Documentable
{
    protected $resource;
    protected $buffer;

    public function __construct($resource, $buffer = 4096)
    {
        $this->resource = $resource;
        $this->buffer = $buffer;
    }

    public function getId()
    {
        return 'resource-' . (int)$this->resource;
    }

    public function getContent()
    {
        $streamContent = '';
        rewind($this->resource);
        while (feof($this->resource) === false) {
            $streamContent .= fread($this->resource, $this->buffer);
        }

        return $streamContent;
    }
}

마지막 구현(예제 2-10)은 터미널 명령을 실행하고 실행 결과를 얻을 수 있습니다.

예제 2-10 CommandOutputDocument 클래스 정의

<?php
class CommandOutputDocument implements Documentable
{
    protected $command;

    public function __construct($command)
    {
        $this->command = $command;
    }

    public function getId()
    {
        return $this->command;
    }

    public function getContent()
    {
        return shell_exec($this->command);
    }
}

예제 2-11은 DocumentStore 클래스를 사용하여 우리가 구현한 Documentable을 작동하는 방법을 보여줍니다. 인터페이스의 세 가지 문서 컬렉션 클래스

예 2-11 DocumentStore

<?php
$documentStore = new DocumentStore();

// Add HTML document
$htmlDoc = new HtmlDocument(&#39;http://php.net&#39;);
$documentStore->addDocument($htmlDoc);

// Add stream document
$streamDoc = new StreamDocument(fopen('stream.txt', 'rb'));
$documentStore->addDocument($streamDoc);

// Add terminal command document
$cmdDoc = new CommandOutputDocument('cat /etc/hosts');
$documentStore->addDocument($cmdDoc);

print_r($documentStore->getDocuments());

이것의 가장 큰 하이라이트는 인터페이스 외에도 HtmlDocument, StreamDocument 및 CommandOutputDocument 클래스 일관성을 제외하고 다른 측면은 완전히 다릅니다.

오늘날 프로그래밍 인터페이스는 더욱 유연한 코드를 생성하며 더 이상 특정 구현에 신경 쓰지 않고 이러한 작업을 다른 사람에게 맡깁니다. 점점 더 많은 사람들(예: 동료, 오픈 소스 프로젝트 사용자 또는 한 번도 만난 적이 없는 개발자)이 원활하게 작동하는 코드를 작성할 수 있으며 그들은 Just 인터페이스를 이해하기만 하면 됩니다.

위의 내용은 [Modern PHP] Chapter 2 새로운 기능 2 인터페이스 기반 프로그래밍에 대한 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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