真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP解耦的示例分析-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(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ò),可以把它分享出去讓更多的人看到吧!


分享名稱:PHP解耦的示例分析-創(chuàng)新互聯(lián)
分享鏈接:http://weahome.cn/article/diidjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部