我们有三个类,Db,FileSystem,Session;实际业务需求要组合操作这三个类.

一.常规做法

class Db
{
public function read($id)
{ }
} class FileSystem
{
public function writeFile($file)
{ }
} class Session
{
public function setSession($sessionName)
{ }
} // 实际逻辑
class Logic
{
protected $db;
protected $file;
protected $session; public function __construct()
{
$this->db = new Db();
$this->file = new FileSystem();
$this->session = new Session();
} public function handle($id)
{
if ($name = $this->db->read($id)) {
$this->file->writeFile(md5($name) . '.txt');
$this->session->setSession($id);
}
}
} $id = 11;
$client = new Logic();
$client->handle($id);

  

缺点:
Logic内部高度耦合了,Db,FileSystem,Session
如果这三个类的初始化条件变化,则需要修改Logic的构造方法.

二.参数依赖(类型提示,将新建关联类的放入调用处)

修改Logic代码如下:

class Logic
{
protected $db;
protected $file;
protected $session; public function __construct(Db $db, FileSystem $file, Session $session)
{
$this->db = $db;
$this->file = $file;
$this->session = $session;
} public function handle($id)
{
if ($name = $this->db->read($id)) {
$this->file->writeFile(md5($name) . '.txt');
$this->session->setSession($id);
}
}
} $id = 11;
$db = new Db();
$file = new FileSystem();
$session = new Session();
$client = new Logic($db, $file, $session);
$client->handle($id);

  

优点:
实现了解耦

缺点:
业务变动,如果要更改Db类到MySql类或初始化条件变动,代码依然要改动.

ps:大部分的设计模式使用了该解耦方法.

三.容器

1.希望DB类,Session类,FileSystem类“拿来即用”,不用每次繁琐的初始化,比如写$db=new DB(arg1,arg2);这类语句。
2.希望DB等类型的对象是“全局”,在整个程序运行期间,随时可以调用。
3.调用DB等类型的程序员不用知道这个类太多的细节,甚至可以用一个字符串的别名来创建这样一个对象。

能够实现以上目标的就是IOC容器,可以把IOC容器简单的看成一个全局变量,并用关联数组把字符串和构造函数做绑定

// 容器
class Container
{
public $binds = array(); public function bind($abstract, $concreate)
{
$this->binds[$abstract] = $concreate;
} public function make($abstract, $params = [])
{
return call_user_func_array($this->binds[$abstract], $params);
}
} // 绑定或注册
$container = new Container();
$container->bind('db', function () {
return new Db();
});
$container->bind('file', function () {
return new FileSystem();
});
$container->bind('session', function () {
return new Session();
}); // 实际逻辑,容器依赖
class Logic
{
protected $db;
protected $file;
protected $session; public function __construct(Container $container)
{
$this->db = $container->make('db');
$this->file = $container->make('file');
$this->session = $container->make('session');
} public function handle($id)
{
if ($name = $this->db->read($id)) {
$this->file->writeFile(md5($name) . '.txt');
$this->session->setSession($id);
}
}
} $id = 11;
$logic = new Logic($container);
$logic->handle($id);

  

本文参考自:https://www.cnblogs.com/sweng/p/6430374.html

php解耦的三种境界的更多相关文章

  1. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

  2. zha男/女的三种境界

    本文为chedan贴,谈一谈找对象时渣男/女的三种表现,分别对应三种境界,涉世未深的男生女生可加以小心,自身属于zha类型的可略过本文.    另,本文的恋爱观基于两个原则.一是对象应是从朋友到恋人的 ...

  3. 【转】从框架看PHP的五种境界及各自的薪资待遇

    无意中看到这篇文章,有些触动,作为博客开篇,用来激励自己. 原文地址:点击打开 在撰写此文前首先必须申明的是本人不鄙视任何一种框架,也无意于挑起PHP框架间的战争,更没有贬低某个框架使用者的用意,本文 ...

  4. 转:从框架看PHP的五种境界及各自的薪资待遇(仅限于二三线城市,一线除外)

    在撰写此文前首先必须申明的是本人不鄙视任何一种框架,也无意于挑起PHP框架间的战争,更没有贬低某个框架使用者的用意,本文纯粹个人的看法.你可以认为我无知也好,或者装逼也好,请不要试着在任何情况下,随便 ...

  5. 在ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller ...

  6. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  7. ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  8. Struts中的数据处理的三种方式

    Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...

  9. Spring IOC以及三种注入方式

    IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...

随机推荐

  1. 《Java编程思想》笔记 第三章 操作符

    1.操作符种类: 运算顺序1-7 一元操作符(单目操作符)  - 负号, + 正号,--递减,++递增 算术操作符 + - *  /  % 移位操作符  <<左移(低位补0),>&g ...

  2. Django基础之路由系统

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...

  3. poj 1066(枚举+线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6328   Accepted: 2627 Des ...

  4. Python 进阶 之 map()函数

    map()函数主要功能是对批量的元素进行相同的操作时可以大幅度的缩减代码. map函数参数详解: map(param1,param2,***) param1:函数名 ,要对批量元素进行处理的funct ...

  5. (四)监控cpu

    定义规则:创建模板--->群组--->应用集--->监控项--->图形--->触发器--->添加主机(加入到群组,关联模板) 1)cpu空闲率,用户态使用率,内核态 ...

  6. android 仿真器联网

    1.查看仿真器dns C:\Users\meng\AppData\Local\Android\Sdk\platform-tools>adb shell 再输入 getprop 2.查看仿真器的名 ...

  7. Python练习——同时安装python2 与 python 3如何选择不同解释器运行脚本

    如果同时安装了python 2 和python 3 那么我们需要在运行时指定解释器 如下: 其中py -2 ex1.py指定了解释器的版本,以及打开的文件 如果使用 py-3 ex1.py则使用了py ...

  8. RPD Volume 168 Issue 4 March 2016 评论1

    GEANT4 calculations of neutron dose in radiation protection using a homogeneous phantom and a Chines ...

  9. Maven / Nexus 的用法和经验

    Maven / Nexus 的用法和经验

  10. [CF919E]Congruence Equation

    题意:求关于$n$的方程$n\cdot a^n\equiv b\left(mod\ p\right)$在$[1,x]$中整数解的数量 果然是Chinese round,interesting roun ...