PHP淺談程式碼架構之解耦。本文主要介紹了PHP解耦的三重境界以及服務容器的相關知識。具有很好的參考價值。希望對大家有幫助。
在完成整個軟體專案開發的過程中,有時需要多人合作,有時也可以自己獨立完成,不管是哪一種,隨著程式碼量上升,寫著寫著就「失控」了,漸漸“醜陋接口,骯髒實現”,項目維護成本和難度上升,到了難以維持的程度,只有重構或重新開發。
第一重境界
假設場景:我們需要寫一個處理類,能夠同時操作會話,資料庫和檔案系統。我們或許會這麼寫。
境界特性:可以運行,但是嚴重耦合
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();
寫法缺點:
##1 .在公有函數中建構對象,一旦涉及到如資料庫參數的變動,修改會有很大的工作量
2.負責設計Writer類別的人員需要對DB等類別的各種API要熟悉
有沒有辦法降低耦合度?
第二重境界(參數依賴)
#假設場景:資料庫位址因為客戶不同,需要經常更換,呼叫到DB的類很多(假如有幾十個),希望即使更改了資料庫位址,也不用去修改這些類別的程式碼。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();
第三重境界(IOC容器)
#經過前兩重境界,我們希望能新增以下這些好處:
1.希望DB類,Session類,FileSystem類“拿來即用”,不用每次繁瑣的初始化,比如寫$db=new DB(arg1, arg2);這類語句。
2.希望DB等類型的物件是“全域”,在整個程式運行期間,隨時可以呼叫。
3.呼叫DB等類型的程式設計師不用知道這個類別太多的細節,甚至可以用一個字串的別名來建立這樣一個物件。
能夠實現以上目標的就是IOC容器,可以把IOC容器簡單的看成一個全域變量,並用關聯數組把字串和建構子做綁定。 我們先實作一個容器類別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); } }
$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);
相關推薦:
Yii2 兩個模組(module)間的資料需要互相調用,如何設計才能最大程度降低耦合性?
介面抽象類別PHP中以介面、抽象類別、普通基底類別實作「面向介面程式設計」與「耦合方法」簡述
以上是PHP淺談程式碼架構之解耦的詳細內容。更多資訊請關注PHP中文網其他相關文章!