PHP控制反转(IOC)
控制翻转:IOC(inversion of control)控制反转模式;控制反转是将对3类(组件间)的依赖关系从程序内部提到外部来管理;
概念理解
我们先来介绍控制反转,依赖注入,这两个概念我们可以认为他们表达的同一种意思,举个通俗的例子,我们用户登录需要提供记录日志的功能,可以选择使用文件或者数据库。下面我们用代码来演示。
// 定义写日志的接口规范 interface log { public function write(); } // 文件记录日志 class FileLog implements Log { public function write(){ echo 'file log write...'; } } // 数据库记录日志 class DatabaseLog implements Log { public function write(){ echo 'database log write...'; } } // 程序操作类 class User { protected $fileLog; public function __construct() { $this->fileLog = new FileLog(); } public function login() { // 登录成功,记录登录日志 echo 'login success...'; $this->fileLog->write(); } } $user = new User(); $user->login();
上面的写法可以实现记录日志的功能,但是有一个问题,假设现在想用数据库记录日志的话,我们就得修改User类,这份代码没达到解耦合,也不符合编程开放封闭原则,那如何修改呢?我们可以把日志处理类通过构造函数方式传递进去。下面我们试着修改User类的代码。
class User { protected $log; public function __construct(Log $log) { $this->log = $log; } public function login() { // 登录成功,记录登录日志 echo 'login success...'; $this->log->write(); } } $user = new User(new DatabaseLog()); $user->login();
这样想用任何方式记录操作日志都不需要去修改过User类了,只需要通过构造函数参数传递就可以实现,其实这就是“控制反转”。不需要自己内容修改,改成由外部外部传递。这种由外部负责其依赖需求的行为,我们可以称其为 “控制反转(IoC)”。