Menu

Contracts契约之面向接口编程

这一节的内容很简单。其实在我们讲依赖注入的时候已经说过了。我们再来具体解释一下。

什么是契约

  1. 契约就是所谓的面向接口编程。

我们拿之前的例子说如果不使用接口会有什么问题?


// 文件记录日志
class FileLog
{
    public function write(){
        echo 'file log write...';
    }
}

// 数据库记录日志
class DatabaseLog
{
    public function write(){
        echo 'database log write...';
    }
}

class User
{
    protected $log;
    public function __construct(FileLog $log)
    {
        $this->log = $log;
    }
    public function login()
    {
        // 登录成功,记录登录日志
        echo 'login success...';
        $this->log->write();
    }
}

$user = new User(new FileLog());
$user->login();

就说上面的,看似没有什么问题,那如果随着我们日后需求的变更,想更换数据库作为记录日志的方式呢?那就得去改User类,没有解偶。

所以才有了面向接口编程,也就是laravel中的契约。代码修改如下。


// 定义日志的接口规范
interface log
{
    public function write();   
}

// 文件记录日志
class FileLog implements Log
{
    public function write(){
        echo 'file log write...';
    }   
}

// 数据库记录日志
class DatabaseLog implements Log
{
    public function write(){
        echo 'database log write...';
    }   
}

class User 
{
    protected $log;

    public function __construct(Log $log)
    {
        $this->log = $log;   
    }

    public function login()
    {
        // 登录成功,记录登录日志
        echo 'login success...';
        $this->log->write();
    }

}

$user = new User(new DatabaseLog());
$user->login();

在Laravel中契约是什么样子的?

比如Cache,定义的契约规范在Illuminate\Contracts\Cache\Repository文件中。

我们可以写多种缓存方式如file,redis,memcached实现这个契约,编写契约中的set,get,remove之类的方法

在使用上,跟上面的例子一样,构造函数或者方法只需要传入对应的契约接口,使用的时候可以随意更换file,redis,memcached

示例代码下载链接

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~