Blogger Information
Blog 8
fans 0
comment 0
visits 5889
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
对容器注入的理解,以及门面Facade的认识-2018年5月28日
往昔流逝的博客
Original
568 people have browsed it

容器(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();

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post