• 技术文章 >后端开发 >php教程

    聊聊框架开发的依赖注入,容器与外观模式(上部)

    不言不言2018-07-14 11:53:23原创618
    这篇文章主要介绍了关于聊聊框架开发的依赖注入,容器与外观模式(上部),有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    一、依赖注入与解藕

    热恋中的男女,经常会说,离开你,我就活不下去了,这是多么深的依赖呀~~

    编程中的依赖,与我们生活中的依赖,本质是一样的:我的工作,离不开你的支持,没有你,就没有我。

    依赖有二种: 一是功能上,二是顺序上的,下面我们用实例来进行说明:

    我们现在有这样的一个任务:

    用户登录操作

    1.涉及数据库操作,数据验证,模板输出;

    2.分别对应Db类,Validate类,View类;

    3.仅做演示,具体实例请同学们自行完成;

    在正式编码前,先简单了解一下什么是客户端?

    1. 客户端:只要能发起请求,都可以看作客户端,浏览器,一段代码都可以

    2. 以下的代码,在实例化User类,并调用其内部的loign方法进行工作

    3. 所以,$user = new User();就是客户端代码

    4. 或者,也可以这样理解,凡写在类或函数等代码之外的,都可看作客户端

    源码如下:

    <?php 
    //数据库操作类
    class Db
    {
    //数据库连接
    public function connect()
    {
    return '数据库连接成功<br>';
    }
    }
    //数据验证类
    class Validate
    {
    //数据验证
    public function check()
    {
    return '数据验证成功<br>';
    }
    }
    //视图图
    class View
    {
    //内容输出
    public function display()
    {
    return '用户登录成功';
    }
    }
    //用户类
    class User
    {
    //用户登录操作
    public function login()
    {
    //实例化Db类并调用connect()连接数据库
    $db = new Db();
    echo $db->connect();
    //实例化Validate类并调用check()进行数据验证
    $validate = new Validate();
    echo $validate->check();
    //实例化视图类并调用display()显示运行结果
    $view = new View();
    echo $view->display();
    }
    }
    //创建User类
    $user = new User();
    //调用User对象的login方法进行登录操作
    echo $user->login();

    以上代码尽管可以正常工作,但仍存在以下问题:

    1. 以上的四个类,只有User是实际工作类,其它三个都是工具类(Db,Validate,View)

    2. 工作类中调用的工具类一旦发生变化,必须修改对这些工具类的所有引用代码,例如Db参数变化

    3. 工作类的调用者必须对要用到的所有工具类,非常熟悉,对参数与返回值必须了解

    4. 工作类对以上三个工具类,形成了严重的依赖,也叫类之间严重耦合

    下面我们通过最常用的依赖注入(DI)来解藕

    我们先了解一下解藕的基本思路:

    1.依赖注入并不神性

    2.本质上来说,就是对工具类的实例化不在工作类中完成,而是在工作类之外,即客户端完成

    3.由于工具类实例化在客户端完成,所在在工作类中,必须要有接收器用来保存实例化的工具对象

    4.此时,用户就可以将在客户端已经实例化好的工具对象,以参数的方式直接传递给工作类的方法

    5.这种由外部直接将对象传入到当前工作类的方式,就叫依赖注入

    源码如下:

    <?php
    //数据库操作类
    class Db
    {
    //数据库连接
    public function connect()
    {
    return '数据库连接成功<br>';
    }
    }
    //数据验证类
    class Validate
    {
    //数据验证
    public function check()
    {
    return '数据验证成功<br>';
    }
    }
    //视图图
    class View
    {
    //内容输出
    public function display()
    {
    return '用户登录成功';
    }
    }
    //用户类
    class User
    {
    //创建三个成员属性,用来保存本类所依赖的对象
    protected $db = null;
    protected $validate = null;
    protected $view = '';
    //用户登录操作
    public function login(Db $db, Validate $validate, View $view)
    {
    //实例化Db类并调用connect()连接数据库
    // $db = new Db();
    echo $db->connect();
    //实例化Validate类并调用check()进行数据验证
    // $validate = new Validate();
    echo $validate->check();
    //实例化视图类并调用display()显示运行结果
    // $view = new View();
    echo $view->display();
    }
    }
    //在客户端完成工具类的实例化(即工具类实例化前移)
    $db = new Db();
    $validate = new Validate();
    $view = new View();
    //创建User类
    $user = new User();
    //调用User对象的login方法进行登录操作
    // echo $user->login();
    // 将该类依赖的外部对象以参数方式注入到当前方法中,当然,推荐以构造器方式注入最方便
    echo '<h3>用依赖注入进行解藕:</h3>';
    echo $user->login($db, $validate, $view);

    虽然将依赖类的实例化前移到客户端,但解决了类之间的依赖问题

    但是仍存在以下几个问题:

    1.为了使工作类User正常工具,必须事先在外部将所需要的类全部事先实例化;

    2.只要涉及实例化,就要求客户端(调用者)必须对这些依赖类的细节非常了解,例如参数与返回值

    那么能不能让用户把实例化依赖类的步骤都省略掉呢?这样岂不是更好,更简单

    我们调用外部依赖类,只要给一个类名,以及一个创建该类实例的方法(构造器)就可以了呢?

    即: 我们只给出: 类名, 创建类实例的方法,其它一概不管

    下面我们通过的"容器技术"来这现这种傻瓜式的的解藕过程

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    聊聊框架开发的依赖注入,容器与外观模式(下部)

    以上就是聊聊框架开发的依赖注入,容器与外观模式(上部)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:依赖注入
    上一篇:如何解决PHP的高并发和大流量的问题 下一篇:聊聊框架开发的依赖注入,容器与外观模式(中部)
    大前端线上培训班

    相关文章推荐

    • 五分钟带你了解PHP中的魔术方法(实例详解)• PHP中clone关键字和__clone()方法的使用(实例详解)• PHP中的命名空间定义与使用(实例详解)• 带你分清类中的构造函数与析构函数• 怎样去搞定PHP类的继承?(总结分享)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网