原始代码


<?php
//数据库操作

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

//用户

/**
 * Class User
 * 工作类
 */
class User
{
    public function login()
    {
        //链接数据库
        $db = new Db();
        echo $db->init();
        //数据验证
        $validate = new Validate();
        echo $validate->check();
        //视图
        $view = new View();
        echo $view->display();
    }
}

/**
 * 客户端:只要能发起请求的
 * 浏览器,ajax,一段代码
 */
$user = new User();
$user->login();
/*
 * 1.只有user是工作类,db,validate,view是工具类
 * 2.如果工具类发生变化,所有对该类的引用都要进行修改(参数)
 * 3.工作类的调用者必须非常了解用到的工具类
 * 4.工作类对三个工具类:Db,validate,view,形成严重依赖,耦合
 * 粘合度太强。
 *
 * 解决耦合的过程叫解耦 最常用的  依赖注入DI
 *
 */

依赖注入解耦

<?php
//数据库操作

/**
 * 依赖注入实现解耦
 * 1.在工作类中调用的工具类实例化在类外完成
 */

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

//用户

/**
 * Class User
 * 工作类
 */
class User
{
    protected $db=null;
    protected $validate=null;
    protected $view=null;
    //构造器注入
    public function __construct(Db $db,Validate $validate,View $view)
    {
        $this->db=$db;
        $this->validate=$validate;
        $this->view=$view;
    }

    public function login()
    {
        //链接数据库
        echo $this->db->init();
        //数据验证
        echo $this->validate->check();
        //视图

        echo $this->view->display();
    }
}

/**
 * 客户端:只要能发起请求的
 * 浏览器,ajax,一段代码
 */

//类外实例化
$db = new Db();
$validate = new Validate();
$view = new View();


$user = new User($db,$validate,$view);
echo "依赖注册解耦\n";
$user->login();

依赖容器解耦

<?php
/**
 * 容器 container ,服务容器/对象容器/类容器/接口:即插即用
 * 分为三步
 * 1. 创建容器 :将类与类的实例化过程绑定到容器中
 * 2. 服务注册 :将可能用到的工具绑定到容器中
 * 3. 容器依赖 :从依赖对象到依赖一个对象的集合。 直接传入一个容器即可,工具类的实例化由容器完成
 */

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

/**********************************/

//创建容器
class Container
{
    //创建一个数据保存类与类的实例化方法
    public $instance = [];

    public function bind($abstract, Closure $process)
    {
        //键名为类名,值为实例化的方法
        $this->instance[$abstract] = $process;
    }

    //创建类的实例
    public function make($abstract, $process = [])
    {
        return call_user_func_array($this->instance[$abstract],$process);
    }
}

/**********************************/
//服务绑定
$container = new Container();
//db类绑定进去
$container->bind("db", function () {
    return new Db();
});

//validate类绑定进去
$container->bind("validate", function () {
    return new Validate();
});
//view类绑定进去
$container->bind("view", function () {
    return new View();
});
//打印容器
//var_dump($container->instance);

//容器依赖
/**
 * Class User
 * 工作类
 */
class User
{

    public function login(Container $container)
    {
        //链接数据库
        echo $container->make("db")->init();
        //数据验证
        echo $container->make("validate")->check();
        //视图
        echo $container->make("view")->display();
    }
}

$user = new User();
echo "依赖容器实现解耦\n";
$user->login($container);

门面模式

容器类

<?php
/**
 * 容器 container ,服务容器/对象容器/类容器/接口:即插即用
 * 分为三步
 * 1. 创建容器 :将类与类的实例化过程绑定到容器中
 * 2. 服务注册 :将可能用到的工具绑定到容器中
 * 3. 容器依赖 :从依赖对象到依赖一个对象的集合。 直接传入一个容器即可,工具类的实例化由容器完成
 */

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

/**********************************/

//创建容器
class Container
{
    //创建一个数据保存类与类的实例化方法
    public $instance = [];

    public function bind($abstract, Closure $process)
    {
        //键名为类名,值为实例化的方法
        $this->instance[$abstract] = $process;
    }

    //创建类的实例
    public function make($abstract, $process = [])
    {
        return call_user_func_array($this->instance[$abstract],$process);
    }
}

/**********************************/
//服务绑定
$container = new Container();
//db类绑定进去
$container->bind("db", function () {
    return new Db();
});

//validate类绑定进去
$container->bind("validate", function () {
    return new Validate();
});
//view类绑定进去
$container->bind("view", function () {
    return new View();
});

门面实现

<?php
/**
 * Facade 外观模式 门面模式
 * 1.对操作进行封装,对外提供统一接口
 * 2.必须要结合容器,才能实现
 */
require "Container.php";

//创建门面模式
class Facade
{
    //链接数据库
    public static function init(Container $container){
        return $container->make("db")->init();
    }
    //验证数据
    public static function check(Container $container){
        return $container->make("validate")->check();
    }
    //视图
    public static function display(Container $container){
        return $container->make("view")->display();
    }
}
//客户端调用
echo "门面模式\n";
echo Facade::init($container);
echo Facade::check($container);
echo Facade::display($container);
最后修改:2020 年 08 月 06 日 08 : 23 PM
如果觉得我的文章对你有用,请随意赞赏