容器注入及门面模式详解

原创 2018-12-26 17:27:35 383
摘要:<?php/** * 容器:也叫作服务容器(IOC) * 基本思想:拿来就用,最大限度简化外部对象调用,类似于即插即用 * 实现步骤: * 1.创建容器:本质就是讲一个类与它的实现绑定到一个关联数组 * 2.服务注册:初始化这个关联数组,将工具类绑定到容器中 * 3.容器依赖:也叫依赖容器,调用的时候直接传一个容器对象即可,不用再一

<?php


/**

 * 容器:也叫作服务容器(IOC)

 * 基本思想:拿来就用,最大限度简化外部对象调用,类似于即插即用

 * 实现步骤:

 * 1.创建容器:本质就是讲一个类与它的实现绑定到一个关联数组

 * 2.服务注册:初始化这个关联数组,将工具类绑定到容器中

 * 3.容器依赖:也叫依赖容器,调用的时候直接传一个容器对象即可,不用再一个一个传具体的对象

 */


class Db

{

public function  connect(){

return '数据库链接成功<br />';

}

}


class Validate

{

public function check(){

return '数据验证通过<br />';

}

}


class View

{

public function display(){

return '用户登陆成功';

}

}


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

// 一.创建容器类

class Container

{

//创建一个空数组用来保存工具类以及实现方法

protected $instance = [];


//将需要实例化的类与他的实现方法进行绑定:将对象容器初始化

public function bind($abstract,Closure $process){

$this->instance[$abstract] = $process;

}


//创建特定类的实例

public function make($abstract,$params = []){

return call_user_func_array($this->instance[$abstract],[]);

}

}


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

// 二、服务注册:其实就是调用容器的bind方法将对象注册到容器中

$container = new Container();

$container->bind('Db',function(){

return new Db();

});


$container->bind('Validate',function(){

return new Validate();

});


$container->bind('View',function(){

return new View();

});


// var_dump($container->instance);

// die();

// 

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

// 三、容器注入:容器依赖,将所有用到的工具类,以容器的方式注入到当前工作累中

class User{

public function login(Container $container){

echo $container->make('Db')->connect();

echo $container->make('Validate')->check();

echo $container->make('View')->display();

}

}


$user = new User();

echo $user->login($container);


<?php


/**

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

* 就是将一些操作进行封装,对外提供一个统一的接口

* 外观模式与容器依赖是黄金搭档

*/


require_once 'container.php';

/**

* Facade类实现三个功能

* 1.连接数据库

* 2.数据验证

* 3.输出提示

* 对于调用者来说,他不需要事先知道这三个操作在哪个具体的类中,他只需要调用Facade就可以执行以上三个操作

*/

class Facade

{

//连接数据库

public static function connect(Container $container)

{

return $container->make('Db') -> connect();

}

//数据验证

public static function check(Container $container)

{

return $container->make('Validate')->check();

}


//输出提示信息

public static function display(Container $container){

return $container -> make('View')->display(); 

}

}

//客户端调用

echo Facade::connect($container);

echo Facade::check($container);

echo Facade::display($container);

<?php

require_once 'container.php';

//简化门面模式

//在外观模式中,创建一个初始化方法事先注入容器,以简化代码

class Facade

{

protected static $container = null;


//创建一个初始化方法,用来注入容器

public static function initialize(Container $container)

{

self::$container = $container;

}


//连接数据库

public static function connect()

{

return self::$container->make('Db') -> connect();

}

//数据验证

public static function check()

{

return self::$container->make('Validate')->check();

}

//输出提示信息

public static function display(){

return self::$container -> make('View')->display(); 

}

}


//客户端调用

Facade::initialize($container);

echo Facade::connect();

echo Facade::check();

echo Facade::display();


批改老师:天蓬老师批改时间:2018-12-26 17:41:40
老师总结:生活中的容器是用来放东西的, 编程中的容器同样也是用来放东西的,但并不是什么东西都可以放, 这里主要是用来放对象或闭包, 通过门面,对容器中的成员进行包装后, 就可以以统一的方式进行调用 了

发布手记

热门词条