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

本文介绍了如何通过容器实现类的统一管理和对象的唯一性,详细阐述了服务容器(IOC)的概念,以及如何利用它简化类的调用。同时,讲解了外观模式(Facade)的作用,即提供一个静态接口来调用内部操作,增强可测试性和扩展性。文中通过示例展示了如何结合容器和Facade实现不同类的操作封装,强调了两者在实际开发中的黄金搭档关系。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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

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

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

先创建一个容器类:

//数据库操作类

class Db

{

//数据库连接

public function connect()

{

return '数据库连接成功

'; } } //数据验证类 class Validate { //数据验证 public function check() { return '数据验证成功

';

}

}

//视图图

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类:

//可以在外观模型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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值