博客列表 >容器注入与Facade门面 --2018年5月28日

容器注入与Facade门面 --2018年5月28日

笨鸟先飞
笨鸟先飞原创
2018年05月30日 19:42:28584浏览


实例

<?php 
/**
 * 容器:也叫服务容器
 * 基本思想:拿来就用,最大限度简化外部对象调用,类似于:即插即用
 * 基本实现分三步:
 * 1.创建容器:本质就是将一个类与它的实现绑定到一个关联数组;
 * 2.服务注册:初始化这个关联数组,将工具类绑定到容器中
 * 3.容器依赖:也叫依赖容器,调用的时候直接传一个容器对象即可,不用再一个一个的传具体对象
 */
//数据库操作类
class Db
{
	public function connect()
	{
		return '连接数据库成功';
	}
}


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


//视图类
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();

//将Db类绑定到容器中  bind方法结合 两个参数等于
$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)
	{
		// $container->make('db'):实例化Db类创建$db对象
		echo $container->make('db')->connect(),'<br>';

		echo $container->make('validate')->check(),'<br>';

		echo $container->make('view')->display();
	}
}


$user = new User();
echo '<h3>用依赖容器来解耦</h3>';
echo $user->login($container);

运行实例 »

点击 "运行实例" 按钮查看在线实例


实例

<?php 
/**
 * facade: 门面模式,也叫外观模式
 * 就是将一些操作进行封装,对外提供一个统一的接口
 * facade模式与容器依赖是黄金搭档
 */

require  'container.php';//导入容器



/**
 * Facade 类实现三个功能
 * 1.数据库的连接
 * 2.数据验证
 * 3.输出提示
 * 对于调用着来说,他不需要事先知道这三个操作在哪个具体的类中,只需要调用Facade就可以执行以上三个操作
 */

class Facade
{
	//1.连接数据库
	public static function connect(Container $container)
	{
		return $container->make('db')->connect();
	} 

    // 2.数据验证
	public static function check(Container $container)
	{
		return $container->make('validate')->check();
	} 

    // 3.输出提示
	public static function display(Container $container)
	{
		return $container->make('view')->display();
	} 
}

//客户端调用
echo '<h3>使用外观模式Facade门面统一调用</h3>';
echo Facade::connect($container);
echo Facade::check($container);
echo Facade::display($container);

运行实例 »

点击 "运行实例" 按钮查看在线实例


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