接口 demo:
modern-php/
├── data
│ └── stream.txt
└── interface
├── CommandOutputDocument.php
├── DocumentStore.php
├── Documentable.php
├── HtmlDocument.php
├── StreamDocument.php
└── index.php
// interface
<?php interface Documentable { public function getId(); public function getContent(); }
// class x 3 implements interface
<?php require_once __DIR__ . '/Documentable.php'; class HtmlDocument implements Documentable { protected $url; public function __construct($url) { $this->url = $url; } public function getId() { return $this->url; } /** * @return string */ public function getContent() { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $this->url, CURLOPT_RETURNTRANSFER => 1, CURLOPT_CONNECTTIMEOUT => 3, CURLOPT_FOLLOWLOCATION => 1, CURLOPT_MAXREDIRS => 3 ]); $html = curl_exec($ch); curl_close($ch); return $html; } }
1 <?php 2 require_once __DIR__ . '/Documentable.php'; 3 4 class StreamDocument implements Documentable { 5 6 protected $resource; 7 protected $buffer; 8 9 public function __construct($resource, $buffer = 4096) { 10 $this->resource = $resource; 11 $this->buffer = $buffer; 12 } 13 14 public function getId() { 15 return 'resource-' .(int)$this->resource; 16 } 17 18 public function getContent() { 19 $streamContent = ''; 20 rewind($this->resource); 21 while (feof($this->resource) === false) { 22 $streamContent .= fread($this->resource, $this->buffer); 23 } 24 return $streamContent; 25 } 26 }
1 <?php 2 require_once __DIR__ . '/Documentable.php'; 3 4 class CommandOutputDocument implements Documentable { 5 6 protected $command; 7 8 public function __construct($command) { 9 $this->command = $command; 10 } 11 12 public function getId() { 13 return $this->command; 14 } 15 16 public function getContent() { 17 return shell_exec($this->command); 18 } 19 }
// Container
1 <?php 2 include 'Documentable.php'; 3 4 class DocumentStore { 5 protected $data = []; 6 7 public function addDocument(Documentable $document) { 8 $key = $document->getId(); 9 $value = $document->getContent(); 10 $this->data[$key] = $value; 11 } 12 13 public function getDocuemnts() { 14 return $this->data; 15 } 16 }
// Usage:
<?php include 'DocumentStore.php'; include 'HtmlDocument.php'; include 'StreamDocument.php'; include 'CommandOutputDocument.php'; $documentStore = new DocumentStore(); $htmlDoc = new HtmlDocument('https://php.net'); $documentStore->addDocument($htmlDoc); $streamDoc = new StreamDocument(fopen('../data/stream.txt', "rb")); $documentStore->addDocument($streamDoc); $cmdDoc = new CommandOutputDocument('cat /etc/hosts'); $documentStore->addDocument($cmdDoc); print_r($documentStore->getDocuemnts());