인터페이스 기반 프로그래밍
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; } }
예제 2-7 Documentable 인터페이스 정의
interface Documentable { public function getId(); public function 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 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 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
<?php $documentStore = new DocumentStore(); // Add HTML document $htmlDoc = new HtmlDocument('http://php.net'); $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());
오늘날 프로그래밍 인터페이스는 더욱 유연한 코드를 생성하며 더 이상 특정 구현에 신경 쓰지 않고 이러한 작업을 다른 사람에게 맡깁니다. 점점 더 많은 사람들(예: 동료, 오픈 소스 프로젝트 사용자 또는 한 번도 만난 적이 없는 개발자)이 원활하게 작동하는 코드를 작성할 수 있으며 그들은 Just 인터페이스를 이해하기만 하면 됩니다.
위의 내용은 [Modern PHP] Chapter 2 새로운 기능 2 인터페이스 기반 프로그래밍에 대한 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.