Zusammenfassung: Im Prozess des Programmierens sollten wir lernen, wie wir Schnittstellen nutzen können, um unser Leben zu verändern und unsere Selbstfähigkeit erheblich zu verbessern. Schnittstellen sind keine neue Funktion, aber sie sind sehr wichtig. Lassen Sie uns ein kleines Beispiel einer Schnittstelle geben. ...
Stellen Sie sich eine DocumentStore-Klasse vor, die für das Sammeln von Text aus verschiedenen Ressourcen verantwortlich ist. Sie können HTML von Remote-URLs lesen, Ressourcen lesen und Terminalbefehlsausgaben sammeln.
Definieren Sie die DocumentStore-Klasse
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; } }
Da die Parameter der addDocument()-Methode nur Instanzen der Documenttable-Klasse sein können, wie können wir die DocumentStore-Klasse definieren? So ist Documenttable eigentlich keine Klasse, sondern eine Schnittstelle.
Diese Schnittstelle definiert den Tabellennamen implementiert die Documenttable-Schnittstelle und muss eine öffentliche getId()-Methode und eine öffentliche getContent()-Methode bereitstellen.
可是这么做有什么用呢?这么做的好处就是,我们可以分开定义获取稳定的类,而且能使用十分不同的方法。下面是一种实现方式,这种方式使用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这三个类没有任何共同点,只是实现了同一个接口。
Das obige ist der detaillierte Inhalt vonTipps zur Verwendung der PHP-Schnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!