Skip to content

我写的教程文章一般都是从总体到局部,不会急着去介绍细节的东西,也是从今年认认真真的开始写文章,当然在这过程中会出现很多的不足,可能会比较散,所以我尽量一篇文章不写太长,只关注几个点的知识,在不断的写作过程中也是自我提高,自我学习的过程,当然也会犯错,如果有哪里写的不好的地方,还请各位看到的朋友指出,等下个月有空了,就把评论模板做一下,把评论开起来,希望看我文章的朋友都能留下评论,写下自己的感想。

PHP面向接口

回到今天的话题,PHP接口编程,PHP也是一门面向对象的语言,如果懂的设计模式的朋友,就知道接口在设计模式中应用是非常广泛的,简单的一句话:“不管黑猫白猫,能抓到耗子的就是好猫”,面向接口编程就是这个逻辑,不管实现细节,只在乎你能不能实现这个功能

接口实例

下面就拿《Modern PHP》这书里面的代码来举例说明下,面向接口编辑的好处,看下如下代码:

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;
    }
}
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一个是获取文档getDocuments,对于现代的图书馆来说,资源已经除了纸质,其它各种媒介都有可能,所以我们这里有一个Documentable的接口,只要使用了这个接口,就可以存到这个虚拟的图书馆里,看下这个接口:

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

我们只要实现上面的接口,就不需要关心文档实际的存储媒介,像如下代码:

<?php

$documentStore = new DocumentStore();
// Add HTML document
$htmlDoc = new HtmlDocument('https://php.net');
$documentStore->addDocument($htmlDoc);
// Add video document
$videoDoc = new VideoDocument(fopen('seozen.mp4', 'rb'));
$documentStore->addDocument($videoDoc);
// Add audio document
$audioDoc = new AudioDocument(fopen('seozen.mp3', 'rb'));
$documentStore->addDocument($audioDoc);

print\_r($documentStore->getDocuments());
<?php

$documentStore = new DocumentStore();
// Add HTML document
$htmlDoc = new HtmlDocument('https://php.net');
$documentStore->addDocument($htmlDoc);
// Add video document
$videoDoc = new VideoDocument(fopen('seozen.mp4', 'rb'));
$documentStore->addDocument($videoDoc);
// Add audio document
$audioDoc = new AudioDocument(fopen('seozen.mp3', 'rb'));
$documentStore->addDocument($audioDoc);

print\_r($documentStore->getDocuments());

如果以后有新的存储媒介,也只要再实现下这个接口就可以,不需要去改去太多的代码,更多的接口应用会在其它的文章来介绍,这里就先简单的举个例子,让大家有个概念。