1。术语介绍OOD,面向对象设计DIP,依赖倒置(软件设计原则)IOC,控制反转(软件设计模式)DI,DependencyInjectionIOCContainer,InversionofControlContainer,也叫DependencyInjectionContainerprovider,实际上是对象提供服务)2.依赖倒置原则(DIP)2.0引入了依赖倒置原则,对依赖进行转换。高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口。请参考点我2.1场景描述提供电脑存储服务。根据不同的用户需求,需要使用不同的存储设备。2.2不遵循依赖倒置原则的例子2.2.1定义服务提供者(实际提供服务)//定义一个硬盘存储类(服务提供者)classHardDiskStorage{publicfunctionsaveToHardDisk(){}publicfunctionreadFromHardDisk(){}}//定义一个U盘存储类(服务提供者)classUStorage{publicfunctionsaveToU(){}publicfunctionreadFromU(){}}2.2.2定义服务(对外提供服务的对象)/***定义一个ComputerStorage类(存储服务)*///第一种:以硬盘为对象提供实际服务classComputerStorage{protected$_storage=null;函数__construct(){$this->_storage=newHardDiskStorage();}publicfunctionsave(){$this->_storage->saveToHardDisk();}publicfunctionread(){$this->_storage->readFromHardDisk();}}//第二种:以U盘为对象提供实际服务classComputerStorage{protected$_storage=null;函数__construct(){$this->_storage=newUStorage();}publicfunctionsave(){$this->_storage->saveToU();}发布集成电路函数读取(){$this->_storage->readFromU();}}//读取$cs=newComputerStorage();$cs->read();2.2.3代码分析根据上面的代码,当切换服务提供者时,服务类的代码需要改动很多,saveToU,readFromHardDisk,readFromU),高层模块依赖于低层模块的实现,这违反了依赖倒置原则。2.3依赖倒置原理示例2.3.1场景同2.1介绍的场景。2.3.2定义服务列表(高层模块定义接口)interfaceServiceList{publicfunctionsave();publicfunctionread();}2.3.3定义服务提供者//硬盘类HardDiskStorageimplementsServiceList{publicfunctionsave(){}publicfunctionread(){}}//U盘类UStorageimplementsServiceList{publicfunctionsave(){}publicfunctionread(){}}2.3.4定义服务类ComputerStorage{protected$_storage=null;函数__construct(){$this->_storage=newHardDiskStorage();}publicfunctionsave(){$this->_storage->save();}publicfunctionread(){$this->_storage->read();}}$cs=newComputerStorage();$cs->read();2.3.5代码分析在上面的代码中,预先定义了服务列表(接口,ServiceList),然后由服务提供者实现这些接口(HardDiskStorage,UStorage),服务(ComputerStorage)只需要切换服务提供者(HardDiskStorage,UStorage),无需关注它们的实现(readFromHardDisk,readFromU...等)。高层模块不依赖于低层模块定义的实现,遵循依赖倒置原则3.控制反转(IOC)+依赖注入(DI)3.0引入了控制反转(IoC),即为相互依赖的组件提供抽象,将依赖(低级模块)对象的获取由第三方(系统)控制,即依赖对象不在依赖模块的类中,直接通过new获取.详情请点我。3.1场景同2场景3.2没有实现控制反转的例子2中的例子是没有实现控制反转的例子。2、ComputerStorage通过construct构造函数获取依赖(HardDiskStorage或UStorage),即在类内部实例化依赖。3.3控制反转实现示例以下代码根据2.classComputerStorage{protected$_storage=null;稍作调整。/***内部只获取依赖实例*/publicfunctionsetStorage($storage){$this->_storage=$storage;}publicfunctionsave(){$this->_storage->save();}publicfunctionread(){$this->_storage->read();}}//外部实例化依赖$hardDiskStorage=newHardDiskStorage();$cs=newComputerStorage();//注入依赖$cs->setStorage($hardDiskStorage);4.依赖注入容器(IOC容器)4.0场景同2场景。4.1使用IOC容器classContainer{//registryprotectedstatic$_registry=null;//保存到注册表publicstaticfunctionset($classname,Callable$create){self::$_registry[$classname]=$create;}//获取registry对应类的实例publicstaticfunctionget($key){call_user_func(self::$_registry[$key]);}}classComputerStorage{protected$_storage=null;函数__construct(){$this->_storage=Container::get('HardDiskStorage');}publicfunctionread(){$this->_storage->read();}publicfunctionsave(){$this->_storage->save();}}/***注册依赖*/Container::set('HardDiskStorage',function(){returnnewHardDiskStorage();});Container::set('UStorage',function(){returnnewUStorage();});//测试$cs=newComputerStorage();$cs->read();
