這篇文章給大家分享的是有關(guān)PHP解耦的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
公司主營業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出東蘭免費(fèi)做網(wǎng)站回饋大家。閱讀本文之前你需要掌握:PHP語法,面向?qū)ο?/strong>
在完成整個(gè)軟件項(xiàng)目開發(fā)的過程中,有時(shí)需要多人合作,有時(shí)也可以自己獨(dú)立完成,不管是哪一種,隨著代碼量上升,寫著寫著就“失控”了,漸漸“丑陋接口,骯臟實(shí)現(xiàn)”,項(xiàng)目維護(hù)成本和難度上升,到了難以維持的程度,只有重構(gòu)或者重新開發(fā)。
第一重境界
假設(shè)場景:我們需要寫一個(gè)處理類,能夠同時(shí)操作會(huì)話,數(shù)據(jù)庫和文件系統(tǒng)。我們或許會(huì)這么寫。
境界特征:可以運(yùn)行,但是嚴(yán)重耦合
class DB{ public function DB($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class FileSystem{ public function FileSystem($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Session{ public function Session($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Writer{ public function Write(){ $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); } } $writer=new Writer(); $writer->write();
寫法缺點(diǎn):
1.在公有函數(shù)中構(gòu)造對象,一旦涉及到如數(shù)據(jù)庫參數(shù)的變動(dòng),修改會(huì)有很大的工作量
2.負(fù)責(zé)設(shè)計(jì)Writer類的人員需要對DB等類的各種API要熟悉
有沒有辦法降低耦合度?
第二重境界(參數(shù)依賴)
假設(shè)場景:數(shù)據(jù)庫地址因?yàn)榭蛻舨煌枰?jīng)常更換,調(diào)用到DB的類很多(假如有幾十個(gè)),希望即使更改了數(shù)據(jù)庫地址,也不用去修改這些類的代碼。
class DB{ public function DB($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class FileSystem{ public function FileSystem($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Session{ public function Session($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Writer{ protected $_db; protected $_filesystem; protected $_session; public function Set($db,$filesystem,$session){ $this->_db=$db; $this->_filesystem=$filesystem; $this->_session=$session; } public function Write(){ } } $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); $writer=new Writer(); $writer->Set($db,$filesystem,$session); $writer->write();
雖然把DB類的構(gòu)造移到了客戶端,一旦涉及修改,工作量大大降低,但是新問題來了:為了創(chuàng)建一個(gè)Writer類,我們需要先創(chuàng)建好DB類,F(xiàn)ileSystem類等,這對負(fù)責(zé)涉及Writer類的人來說,要求是很高的,他需要看很多其他類文檔,一個(gè)個(gè)創(chuàng)建(可能還需要初始化),然后才能創(chuàng)建出他要的writer變量。
所以,我們希望,能有一種更好的寫法,使得寫Writer類的人,用一種更加快捷的接口,就能創(chuàng)建和調(diào)用他要的類,甚至連參數(shù)都不用填。
第三重境界(IOC容器)
經(jīng)過前兩重境界,我們希望能新增以下這些好處:
1.希望DB類,Session類,F(xiàn)ileSystem類“拿來即用”,不用每次繁瑣的初始化,比如寫$db=new DB(arg1,arg2);這類語句。
2.希望DB等類型的對象是“全局”,在整個(gè)程序運(yùn)行期間,隨時(shí)可以調(diào)用。
3.調(diào)用DB等類型的程序員不用知道這個(gè)類太多的細(xì)節(jié),甚至可以用一個(gè)字符串的別名來創(chuàng)建這樣一個(gè)對象。
能夠?qū)崿F(xiàn)以上目標(biāo)的就是IOC容器,可以把IOC容器簡單的看成一個(gè)全局變量,并用關(guān)聯(lián)數(shù)組把字符串和構(gòu)造函數(shù)做綁定。
我們先實(shí)現(xiàn)一個(gè)容器類
class Container{ public $bindings; public function bind($abstract,$concrete){ $this->bindings[$abstract]=$concrete; } public function make($abstract,$parameters=[]){ return call_user_func_array($this->bindings[$abstract],$parameters); } }
服務(wù)注冊(綁定)
$container=new Container(); $container->bind('db',function($arg1,$arg2){ return new DB($arg1,$arg2); }); $container->bind('session',function($arg1,$arg2){ return new Session($arg1,$arg2); }); $container->bind('fs',function($arg1,$arg2){ return new FileSystem($arg1,$arg2); });
容器依賴
class Writer{ protected $_db; protected $_filesystem; protected $_session; protected $container; public function Writer(Container $container){ $this->_db=$container->make('db',[1,2]); $this->_filesystem=$container->make('session',[3,4]); $this->_session=$container->make('fs',[5,6]); } } $writer=new Writer($container);
感謝各位的閱讀!關(guān)于“PHP解耦的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!