php什么情况可以解耦,php解耦的三种境界

我们有三个类,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

原文:http://www.cnblogs.com/itfenqing/p/7819500.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值