欢迎来到天天文库
浏览记录
ID:22811925
大小:110.06 KB
页数:6页
时间:2018-10-31
《谈谈php里的ioc控制反转,di依赖注入》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、谈谈php电的1OC控制反耗,U1依赖注入押论发现问®在深入细节之莳.萡要确保我们理解"IOC控制反转”和"DI依赖注入"是什么.能够解决什么问题,这岬在缞基R科中有浙常淸晰的说明.控制反«(ln%ersH>n»fControl,缩与为l«C):足llii向刈象ft程中的•种设计说则,可以用来城低计算机代码之间的播合度.依検《入(DcpcncknvyInjection.简称1)1〉:IM苌IOC的一种实现,表现力:在类A的实例创违过f?中即创建了依桷的B对».通过类型成名称末判断将不冋的对入到不同的W性中.依赖盘找(IkpemknQLookup.简称I》L〉:l)L是IOC的另外一种实现.在B
2、?要的时候通过调用似架提供的方法來获取对象.获取时》要提供相关的配S义件路择、key玲估息來确定获取对ft依棟注入与依赖ft找是控制反?4•的2种实现方式,后者很少见,我们主接研究依赖注入.如果此的没打按触过这吟根念.可能还是过于抽象不容押解,仴是下面这个场采你应该是见过的:因为大多故应用g序®是由两个或是更多的类通过彼此的合作来实现业务逻辑.这使得毎个对ft®芮要获取合作的对象<也就是它所依飲的对象〉的引用.如束这个获取过程要靠fi身实现,*么这将掉致代码岛坡《合并月.难以锥护和调试,也就是说:"ClassA中用到了ClassB的对象lb—故W况下,笫耍在A的代码中S式的rww—个B的对这就
3、守致如来想将B飪換力一个史忧的实现板本.355?修改代WS式的IWM—个B+对解决这个问«的传统做法一般是为B和B破取一个hiUrfacHKB接口,然后让只依梭huerf趴OFB,最终由A类的调用方决定传入B还ftB♦对象,修改调用方代码和修改类A代码对我们米说并没侖木质的改变,那足杏有更好的方式呢?解决思格终于,懶摘的程序员对这种代硏幵发//式想到厌煩:因为我们在代玛里控制了B类对象的生成.从而异致代丹祺合.即便A类依教ImcrtweOfB.还是要在程序策处写死no*B0或秆这杵的代码,怎么破解?答案是:将B类对象的牛.成交给一个独立的对象牛成器末负灾,那么A类只浦耍依教这个对象牛成器•而至
4、于到底是牛成B还是1卜对象,则是对象牛成器内部的行为.这样就将A和B解fflJT•了.这就是所谓的”控制反转'即将抟制权交给了对象生成番.这么简单的将问8拋洽对象生成器可不行,因为对象生成器还赛面临B还是novB+的硬编码问题,因此必須赋予对象生成器一个超能力:在对象牛成器的配«文件中进行这样的描述:(”InWrfacc(>m••:'ClassB+"
5、,IntcrratcOlB按口应该实例化B+对象.A类构进函数有一个InterfactOfB的入多,例如:function_conMrucUInterfaceOfBubj).调用对ft生成器(l》I>获取A类对ft.DI^uetC'classA-
6、).对象生成器会利用反射分析dassA的构造函数,发现hUerfaveOfB参数G报据此前配置文件描述.nwB+U对ft伶入到A的构造函数,从而生成,对象.总姑上述激«就足:对象生成器通过反W机制分析A芡的构造函效依赖,并根折配覽中的关系生成依赖的对象实例传入给构造函数,嫩终完成A炎刈象的创建。上面的过稃就足”依賴注入"主要实现万式了,对象卞成番我们通常成力”DiContainer-.也就足”依赖注入容器••.需毪注S的是:B成者B+的构造函数可以会依校Ir^rfmeOrC,因此整个依箱关系的分析ft递归的,实践h由在谈DI依赖注入"的时候.我们北常洧楚的了样到1)1会根祺构进函数逬行依相分
7、析.似是很容易忽视
8、”1!1^^^^<)01”:”€:1^1^"
9、这个估息的來源.如采1》1不知道这个估.&•那么在分析构造函数时是不对能知道接口hitcrfaccOfB应该对应什么对象的,这个倍息在01实现屮•般是通过set//法主动设置到DI容器的依教关系中的.当然这个佰总的存tt介/ft町以是配置文件成2硬缤码传入.下面拿PHP的YH2.0框架为例,肴肴它实现1>1时的核心思路袋什么,不会讲的太细.仴上面搽到的思路和概念都会釘所体现,set设I类定义publicfunctionseUSclass,(definition■[],array$p^raim=())$this->_(k*fini
10、tions
11、$clas$
12、=$this->normalizrl)dmition($€lasstSdvfinition);$this->_paramM$class
13、=Sparanis;unset($this>>singletons(Sclass)>;return$llus;这就是上面提利
14、"lnkTfacv()m”:"ClassB+”l的没贾抜U,比如这样用:$<*nnlaiiier.>s(.*«'
此文档下载收益归作者所有