요약: 프로그래밍 과정에서 우리는 인터페이스를 사용하여 삶을 바꾸고 자기 능력을 크게 향상시키는 방법을 배워야 합니다. 인터페이스는 새로운 기능은 아니지만 매우 중요합니다. 인터페이스의 작은 예를 들어보겠습니다. ...
다양한 리소스에서 텍스트를 수집하는 DocumentStore 클래스를 상상해 보세요. 원격 URL에서 HTML을 읽고, 리소스를 읽고, 터미널 명령 출력을 수집할 수 있습니다.
DocumentStore 클래스 정의
class DocumentStore{ protected $data = []; public function addDocument(Documenttable $document){ $key = $document->getId(); $value = $document->getContent(); $this->data[key] = $value; } public function getDocuments(){ return $this->data; } }
addDocument() 메서드의 매개변수는 Documenttable 클래스의 인스턴스만 될 수 있는데 어떻게 DocumentStore 클래스를 이렇게 정의할 수 있을까요?
Define Documenttable
interface Documenttable{ public function getId(); public function getContent(); }
이 인터페이스는 테이블 이름을 정의합니다. Documenttable 인터페이스를 구현하는 모든 개체는 공용 getId() 메서드와 공용 getContent() 메서드를 제공해야 합니다.
可是这么做有什么用呢?这么做的好处就是,我们可以分开定义获取稳定的类,而且能使用十分不同的方法。下面是一种实现方式,这种方式使用curl从远程url获取html。
定义HtmlDocument类
class HtmlDocument implements Documenttable{ 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); curl_close($ch); return $thml; } }
下面一个方法是获取流资源。
class StreamDocument implements Documenttable{ 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; } }
下面一个类是获取终端命令行的执行结果。
class CommandOutDocument implements Documenttable{ protected $command; public function __construct($command) { $this->command=$command; } public function getId(){ return $this->command; } public function getContent(){ return shell_exec($this->command); } }
下面我们来演示一下借助上面的三个类来实现DocumentStore类。
$documentStore = new DocumentStore();//添加html文档$htmlDoc = new HtmlDocument('https:// www.i360.me'); $documentStore->addDocument($htmlDoc);//添加流文档$streamDOC = new StreamDocument(fopen('stream.txt','rb')); $documentStore->addDocument($streamDOC);//添加终端命令文档$cmdDoc = new CommandOutDocument('cat /etc/hosts'); $documentStore->addDocument($command); print_r($documentStore->getDocuments());die;
这里HtmlDocument,StreamDocument,CommandOutDocument这三个类没有任何共同点,只是实现了同一个接口。
위 내용은 PHP 인터페이스 사용에 대한 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!