博客列表 >对容器注入的理解,以及门面Facade的认识-2018年5月28日

对容器注入的理解,以及门面Facade的认识-2018年5月28日

往昔流逝的博客
往昔流逝的博客原创
2018年05月29日 17:30:06561浏览

容器(Container)实现类的统一管理,确保对象实例的唯一性。

容器注入:也叫 依赖注入容器

用户在客户端使用容器来进行类管理,还可以将类的实例(对象)做为参数,传递给类方法,自动触发依赖注入。

想象成一个黑盒子,里面放了很多对象,想要什么对象直接通过容器拿,而不是自己 new ;

容器:也称服务容器,简称(IOC)类似于:[即插即用]的工具,最大限度的简化外部对象的调用。

外观模式:facade,也叫门面模式

门面(Facade)为容器(Container)中的类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade类。

用一句来说:就是将操作进行封装,对外提供一个统一的接口因为操作可能分布在多个类中,而刚才学过的容器恰好可以将不同的类与实现封装起来,所以外观模式与依赖容器是黄金搭档,经常会放在一起使用。

先创建一个容器类:

<?php
//数据库操作类
class Db
{
    //数据库连接
    public function connect()
    {
        return '数据库连接成功<br>
'; } } //数据验证类 class Validate { //数据验证 public function check() { return '数据验证成功<br>
';
    }
}
//视图图
class View
{
    //内容输出
    public function display()
    {
        return '用户登录成功';
    }
}
/******************************************************************************/
//一.创建容器类
class Container
{
    //创建属性,用空数组初始化,该属性用来保存类与类的实例化方法
    public $instance = [];
    //初始化实例数组,将需要实例化的类,与实例化的方法进行绑定
    public function bind($abstract, Closure $process)
    {
        //键名为类名,值为实例化的方法
        $this->instance[$abstract] = $process;
    }
    //创建类实例
    public function make($abstract, $params=[])
    {
        return call_user_func_array($this->instance[$abstract],[]);
    }
}
/******************************************************************************/
//二、服务绑定: 将类实例注册到容器中
$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();
});

然后在创建一个Facade类:

<?php
//可以在外观模型facade中,使用初始化方法事先注入容器对象,来简化客户端调用
require 'container.php';
class Facade
{
    //创建成员属性保存容器对象
    protected static $container = null;
    //创建初始化方法为容器对象赋值
    public static function initialize(Container $container)
    {
        static::$container = $container;
    }
    /**
     * 因为已经在初始化方法中将容器对象导入到了当前类中,
     * 并且保存到了类的静态属性中,为所有类成员所共享,
     * 所以以下方法可直接调用不用再容器注入
     * 注意:这里全部采用后期静态延迟绑定方法来访问当前容器对象
     * 这主要是为了方便用户在静态继承的上下文环境中进行调用
     */
    //连接数据库
    public static function connect()
    {
        return static::$container->make('db')->connect();
    }
    //用户数据验证
    public static function check()
    {
        return static::$container->make('validate')->check();
    }
    //输出提示信息
    public static function display()
    {
        return static::$container->make('view')->display();
    }
}
//客户端调用
//初始化类门面类中的容器对象
Facade::initialize($container);
//静态统一调用内部的方法(无须重复注入依赖容器对象啦,实现了细节隐藏,通用性更强)
echo Facade::connect();
echo Facade::check();
echo Facade::display();

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议