<?php
//数据库操作
/**
* Class Db
* 辅助类
*/
class Db
{
//数据库链接
public function init()
{
return "数据库链接成功\n";
}
}
//数据验证
/**
* Class Validate
* 辅助类
*/
class Validate
{
public function check()
{
return "验证成功\n";
}
}
//视图
/**
* Class View
* 辅助类
*/
class View
{
public function display()
{
return "用户登陆成功\n";
}
}
//用户
/**
* Class User
* 工作类
*/
class User
{
public function login()
{
//链接数据库
$db = new Db();
echo $db->init();
//数据验证
$validate = new Validate();
echo $validate->check();
//视图
$view = new View();
echo $view->display();
}
}
/**
* 客户端:只要能发起请求的
* 浏览器,ajax,一段代码
*/
$user = new User();
$user->login();
/*
* 1.只有user是工作类,db,validate,view是工具类
* 2.如果工具类发生变化,所有对该类的引用都要进行修改(参数)
* 3.工作类的调用者必须非常了解用到的工具类
* 4.工作类对三个工具类:Db,validate,view,形成严重依赖,耦合
* 粘合度太强。
*
* 解决耦合的过程叫解耦 最常用的 依赖注入DI
*
*/
<?php
//数据库操作
/**
* 依赖注入实现解耦
* 1.在工作类中调用的工具类实例化在类外完成
*/
/**
* Class Db
* 辅助类
*/
class Db
{
//数据库链接
public function init()
{
return "数据库链接成功\n";
}
}
//数据验证
/**
* Class Validate
* 辅助类
*/
class Validate
{
public function check()
{
return "验证成功\n";
}
}
//视图
/**
* Class View
* 辅助类
*/
class View
{
public function display()
{
return "用户登陆成功\n";
}
}
//用户
/**
* Class User
* 工作类
*/
class User
{
protected $db=null;
protected $validate=null;
protected $view=null;
//构造器注入
public function __construct(Db $db,Validate $validate,View $view)
{
$this->db=$db;
$this->validate=$validate;
$this->view=$view;
}
public function login()
{
//链接数据库
echo $this->db->init();
//数据验证
echo $this->validate->check();
//视图
echo $this->view->display();
}
}
/**
* 客户端:只要能发起请求的
* 浏览器,ajax,一段代码
*/
//类外实例化
$db = new Db();
$validate = new Validate();
$view = new View();
$user = new User($db,$validate,$view);
echo "依赖注册解耦\n";
$user->login();
<?php
/**
* 容器 container ,服务容器/对象容器/类容器/接口:即插即用
* 分为三步
* 1. 创建容器 :将类与类的实例化过程绑定到容器中
* 2. 服务注册 :将可能用到的工具绑定到容器中
* 3. 容器依赖 :从依赖对象到依赖一个对象的集合。 直接传入一个容器即可,工具类的实例化由容器完成
*/
/**
* Class Db
* 辅助类
*/
class Db
{
//数据库链接
public function init()
{
return "数据库链接成功\n";
}
}
//数据验证
/**
* Class Validate
* 辅助类
*/
class Validate
{
public function check()
{
return "验证成功\n";
}
}
//视图
/**
* Class View
* 辅助类
*/
class View
{
public function display()
{
return "用户登陆成功\n";
}
}
/**********************************/
//创建容器
class Container
{
//创建一个数据保存类与类的实例化方法
public $instance = [];
public function bind($abstract, Closure $process)
{
//键名为类名,值为实例化的方法
$this->instance[$abstract] = $process;
}
//创建类的实例
public function make($abstract, $process = [])
{
return call_user_func_array($this->instance[$abstract],$process);
}
}
/**********************************/
//服务绑定
$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();
});
//打印容器
//var_dump($container->instance);
//容器依赖
/**
* Class User
* 工作类
*/
class User
{
public function login(Container $container)
{
//链接数据库
echo $container->make("db")->init();
//数据验证
echo $container->make("validate")->check();
//视图
echo $container->make("view")->display();
}
}
$user = new User();
echo "依赖容器实现解耦\n";
$user->login($container);
容器类
<?php
/**
* 容器 container ,服务容器/对象容器/类容器/接口:即插即用
* 分为三步
* 1. 创建容器 :将类与类的实例化过程绑定到容器中
* 2. 服务注册 :将可能用到的工具绑定到容器中
* 3. 容器依赖 :从依赖对象到依赖一个对象的集合。 直接传入一个容器即可,工具类的实例化由容器完成
*/
/**
* Class Db
* 辅助类
*/
class Db
{
//数据库链接
public function init()
{
return "数据库链接成功\n";
}
}
//数据验证
/**
* Class Validate
* 辅助类
*/
class Validate
{
public function check()
{
return "验证成功\n";
}
}
//视图
/**
* Class View
* 辅助类
*/
class View
{
public function display()
{
return "用户登陆成功\n";
}
}
/**********************************/
//创建容器
class Container
{
//创建一个数据保存类与类的实例化方法
public $instance = [];
public function bind($abstract, Closure $process)
{
//键名为类名,值为实例化的方法
$this->instance[$abstract] = $process;
}
//创建类的实例
public function make($abstract, $process = [])
{
return call_user_func_array($this->instance[$abstract],$process);
}
}
/**********************************/
//服务绑定
$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();
});
门面实现
<?php
/**
* Facade 外观模式 门面模式
* 1.对操作进行封装,对外提供统一接口
* 2.必须要结合容器,才能实现
*/
require "Container.php";
//创建门面模式
class Facade
{
//链接数据库
public static function init(Container $container){
return $container->make("db")->init();
}
//验证数据
public static function check(Container $container){
return $container->make("validate")->check();
}
//视图
public static function display(Container $container){
return $container->make("view")->display();
}
}
//客户端调用
echo "门面模式\n";
echo Facade::init($container);
echo Facade::check($container);
echo Facade::display($container);
版权属于:尹深
本文链接:https://cloud.tencent.com/developer/article/1795111
转载时须注明出处及本声明
(本站部分资源来自互联网收集整理!如有侵权请联系站长删除!!!)