摘要:一、依赖注入与依赖容器下面的案例User类严重依赖于Db,Validate,View类<?php //数据库操作类 class Db { //数据库连接 public function connect() { return '数据库连接成功<br>'; } } //数据验证类 class Valida
一、依赖注入与依赖容器
下面的案例User类严重依赖于Db,Validate,View类
<?php
//数据库操作类
class Db
{
//数据库连接
public function connect()
{
return '数据库连接成功<br>';
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return '数据验证成功<br>';
}
}
//视图类
class View
{
//内容输出
public function display()
{
return '用户登录成功';
}
}
//用户类
class User
{
//登录操作
public function login()
{
// 实例化Db类,并调用connect()方法连接数据库
$db = new Db();
echo $db->connect();
//实例化Validate类,调用check()进行验证
$validate = new Validate();
echo $validate->check();
//实例化View类,调用display()输出提示
$view = new View();
echo $view->display();
}
}
//客户端调用
//实例化User类
$user = new User();
//调用User类的login()进行登录
$user->login();对于类与类之间的相互依赖可以使用依赖注入和依赖容器来进行解耦.
用依赖注入进行解耦:
<?php
//用依赖注入进行解耦
//数据库操作类
class Db
{
//数据库连接
public function connect()
{
return '数据库连接成功<br>';
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return '数据验证成功<br>';
}
}
//视图类
class View
{
//内容输出
public function display()
{
return '用户登录成功';
}
}
//用户类
class User
{
//登录操作
public function login(Db $db,Validate $validate,View $view)
{
// 实例化Db类,并调用connect()方法连接数据库
// $db = new Db();
echo $db->connect();
//实例化Validate类,调用check()进行验证
// $validate = new Validate();
echo $validate->check();
//实例化View类,调用display()输出提示
// $view = new View();
echo $view->display();
}
}
//先在客户端将工具类全部实例化
$db = new Db();
$validate = new Validate();
$view = new View();
//实例化User类
$user = new User();
//调用User类的login()进行登录
echo '<h3>用依赖注入进行解耦</h3>';
$user->login($db,$validate,$view);用依赖容器来进行解耦:
<?php
/*
容器:也叫服务容器
基本思想:拿来就用,最大限度简化外部对象调用,类似于:即插即用
基本实现分三步:
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();
//将Db类绑定到容器中
$container->bind('db',function(){
return new Db();
});
//将Validate类绑定到容器中
$container->bind('validate',function(){
return new Validate();
});
//将View类绑定到容器中
$container->bind('view',function(){
return new View();
});
//三、容器注入:容器依赖,以所有用到的对象,以容器的方式注入到当前的工作类中
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 '<h3>用依赖容器来实现解耦</h3>';
echo $user->login($container);二、Facade
facade:门面模式,也叫外观模式,就是将一些操作进行封装,对外提供一个统一的接口。
使用外观模式Facade门面统一调用:
<?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);简化后的Facade门面统一调用:
<?php
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();
echo Facade::check();
echo Facade::display();
批改老师:天蓬老师批改时间:2018-11-28 17:36:30
老师总结:希望下次能自己发挥想像力,写一些实用的案例,不必模仿老师的, 例如创建一个用户验证的功能,用容器来封装可能用到的类与对象