资讯专栏INFORMATION COLUMN

如何优雅的使用接口

张金宝 / 1968人阅读

摘要:嗯,刚过完,我们不在是宝宝了,来吧,撸一篇接口的文章在编程的过程中我们应该学会如何使用接口来给变我们的生活,极大的提升自我能力。可是这么做有什么用呢这么做的好处就是,我们可以分开定义获取稳定的类,而且能使用十分不同的方法。

嗯,6.1刚过完,我们不在是宝宝了,来吧,撸一篇接口的文章(interface).

在编程的过程中我们应该学会如何使用接口来给变我们的生活,极大的提升自我能力。
接口不是新特性,但是非常重要,下面我们来撸个接口的小例子。

虚构一个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的类怎么行呢? 其实Documenttable不是类,是接口;

定义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这三个类没有任何共同点,只是实现了同一个接口。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23060.html

相关文章

  • 如何优雅实现多个接口并发?且监听最终结果

    摘要:相信大家工作中调用接口的情况很常见,有时候会有这样的需求进入页面需要多个接口调用结束后,才能让用户进行操作而这几个接口本身并没有先后顺序的要求。最终判断所有变量值都为。 相信大家工作中调用接口的情况很常见,有时候会有这样的需求:进入页面需要多个接口调用结束后,才能让用户进行操作!而这几个接口本身并没有先后顺序的要求。你会怎么做? 1、储存变量方法 因为接口调用是异步行为,所以我们可以在...

    shiweifu 评论0 收藏0
  • 分布式之API接口返回格式如何优雅设计?

    摘要:区间表示参数错误区间表示用户错误区间表示接口异常这样前端开发人员在得到返回值后,根据状态码就可以知道,大概什么错误,再根据相关的信息描述,可以快速定位。享学课堂特邀作者:老顾前言在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,...

    phpmatt 评论0 收藏0
  • Spring Cloud中如何优雅使用Feign调用接口

    摘要:对进行了封装,使其支持标准注解和。可以与和组合使用以支持负载均衡。中使用当我们搭建好注册中心之后,就是需要将自己的服务注册到中,然后别的服务可以直接调用。 JAVA 项目中接口调用怎么做 ? Httpclient Okhttp Httpurlconnection RestTemplate 上面是最常见的几种用法,我们今天要介绍的用法比上面的更简单,方便,它就是 Feign Feig...

    ChanceWong 评论0 收藏0
  • 如何在MyBatis中优雅使用枚举

    摘要:如何解决呢在中我们可以使用方式来干预的创建过程,来完成转换器的指定。再也不用写的配置文件了结束了以上就是我对如何在中优雅的使用枚举的探索。 问题 在编码过程中,经常会遇到用某个数值来表示某种状态、类型或者阶段的情况,比如有这样一个枚举: public enum ComputerState { OPEN(10), //开启 CLOSE(11), ...

    clasnake 评论0 收藏0
  • 如何优雅设计PHP异常

    摘要:现在我就用框架来进行实战下在实际业务中是如何优雅的使用异常的场景描述选择一个比较简单的业务场景,以登录模块为例,用户在移动端进行登录时,需要进行登录,注册,忘记密码,获取手机验证码等接口。 前言 刚开始接触PHP的时候没有意识到异常的重要性,有时候出问题很难精确的找到问题点,正确的处理异常也是一门学问 异常的类别 PHP7异常做了很多变动,异常类 Exception 和错误类 Erro...

    wing324 评论0 收藏0

发表评论

0条评论

张金宝

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<