博主信息
博文 55
粉丝 0
评论 1
访问量 52851
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
容器注入和门面Facade
旺小舞的博客
原创
952人浏览过

思想:以用户登录案例为例,工作类调用三个基本的工具类会出现严重藕合现象,一旦工具类发生变化,工作类就必须对应的更改设置;对工具类的实例化不要在工作类中完成,在(类或函数之外完成)客户端完成,这样必须在工作类中必须要有一个接收器来保存工具类的实例,将工作类依赖的对象以方法参数的方式植入到当前的类中,叫依赖注入。但依赖注入还是要在工作类的客户端进行实例化,怎么能去掉实例化?给出一个类名以及如何去实例化衍生出来了容器注入。

代码实现,创建三个工具类

class Db
{
	public function connect()
	{
		return 'Db连接成功<br>';
	}
}

class Validate
{
	public function check()
	{
		return '数据验证成功<br>';
	}
}

class View
{
	public function display()
	{
		return '用户登录成功<br>';
	}
}

容器注入基本步骤:

1,创建容器:将一个类和他的关联实现绑定到一个关联数组中

class Container
{
	//创建一个空数组用来保存工具类及实现方法
	// protected $instance = []; //创建一个属性
	public $instance = []; 
	// $instance['类名'] = '类的实例化过程\函数';
	
	//将需要实例化的类和它的实现方法进行绑定:降对象容器进行初始化
	public function bind($abstract,Closure $process)
		{
		$this->instance[$abstract] = $process;
		// $this->instance['db'] = function(){
		// 	return new Db('locahost','root','root');
		}
		//创建特定类的实例
		public function make($abstract,$params=[])
		{
			return call_user_func_array($this->instance[$abstract],[]);
		}
}

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

//2,服务注册:其实就是调用容器的bind方法,将对象注册到容器中
$container = new Container();

//将Db类绑定到容器中
$container->bind('db',function(){
	return new Db();
});
$container->bind('validate',function(){
	return new Validate();
});
$container->bind('view',function(){
	return new View();
});

3,容器依赖:也叫依赖容器,调用的时候直接传一个容器对象即可
// 用户类:工作类
class User
{
	public function login(Container $container)
	{
		//$container->make('db'):实例化Db类创建$db对象
		echo $container->make('db')->connect();
		echo $container->make('validate')->check();
		echo $container->make('view')->display();
	}
}
$user = new User();
echo '<h3>用依赖容器来实现解藕</h3>';
echo $user->login($container);

门面Facade:

思想:将一些操作进行封装,对外提供统一接口进行访问,跟网址大全hao123差不多,

Facade类实现三个功能:1,连接数据库; 2,数据验证;3,输出提示

require 'container.php';

class Facade
{
	//创建一个静态属性保存容器对象
	protected static $container = null;

	//创建一个初始化方法,给容器对象赋值
	public static function initialize(Container $container)
	{
		static::$container = $container;
	}

	//1,连接数据库
	public static function connect()
	{
		return static::$container->make('db')->connect();
	}
	//2,数据验证
	public static function check()
	{
		return static::$container->make('validate')->check();
	}
	//3,输出提示
		public static function display()
	{
		return static::$container->make('view')->display();
	}
}
//客户端调用
echo '<h3>简化后的Facade门面统一调用:</h3>';
Facade::initialize($container);//初始化
echo Facade::connect($container);
echo Facade::check($container);
echo Facade::display($container);




批改状态:未批改

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学